Come posso inviare i tasti premuti a una finestra senza doverlo attivare tramite l'API di Windows?

StackOverflow https://stackoverflow.com/questions/1220820

Domanda

& nbsp; & nbsp; & nbsp; & nbsp; Ho già creato un'applicazione che invia comandi a una finestra attivata. Voglio essere in grado di utilizzare il computer mentre il mio processo è in esecuzione perché non appena si sposta lo stato attivo su un'altra finestra, le sequenze di tasti inviate tramite i tasti di invio andranno alla finestra in cui sono appena passato.

& nbsp; & nbsp; & nbsp; & nbsp; Attualmente utilizzo FindWindow, IsIconic e ShowWindow dall'API di Windows. Devo controllare se la finestra è lì con FindWindow e impostare il mio oggetto sulla finestra specifica che viene restituita con quella chiamata, quindi controllo se è ridotto a icona con IsIconic e chiamare ShowWindow se lo è, e infine devo chiamare Interaction.AppActivate per impostare lo stato attivo su quella finestra. Tutto questo viene fatto prima ancora di inviare i tasti. Sembra che ci dovrebbe essere un modo per inviare semplicemente i tasti senza dover mostrare la finestra e attivarla. La cosa importante è che mentre la mia applicazione esegue i tasti premuti, non posso fare nulla sul mio computer.

È stato utile?

Soluzione

Va ??bene, questo è un po 'deludente, ne sono sicuro, ma fondamentalmente non puoi farlo con affidabilità al 100%.

Windows presuppone che la finestra attiva sia quella che ottiene l'input da tastiera. Il modo corretto di falsare l'input da tastiera è con SendInput e noterai che invia messaggi solo alla finestra attiva.

Detto questo, puoi SendMessage WM_KEYUP , WM_CHAR e WM_KEYDOWN e (a seconda del WndProc che li riceve) forse potrebbe cavarsela. Ma ricorda, il suo andrà in frantumi in alcune circostanze, periodo.

Altri suggerimenti

Sembra che tu stia usando keybd_event () o SendInput (), che inviano entrambi i tasti alla finestra attualmente attiva. Per indirizzare i tasti a una finestra specifica, indipendentemente dal fatto che quel widnow sia focalizzato o meno, devi prima trovare il suo handle HWND, quindi pubblicare direttamente i messaggi WM_KEYUP / DOWN e WM_CHAR formattati in modo appropriato.

una volta che hai Windows HWND, puoi direttamente inviare i messaggi WM_KEYDOWN e WM_KEYUP direttamente alla sua coda di messaggi. La finestra non deve essere attiva.

Tuttavia, capire che questo dipende da come l'applicazione di destinazione elabora l'input da tastiera. Esistono diversi modi per gestirlo.

WM_KEYUP / WM_KEYDOWN è più comune e alcune applicazioni elaborano solo l'una o l'altra (di solito WM_KEYDOWN).

Anche WM_CHAR è abbastanza comune

Alcuni programmi utilizzano GetAsyncKeyState, GetKeyState o GetKeyboardState. Questo è estremamente insolito, ma impedisce efficacemente l'iniezione di tasti con SendMessage (). In tal caso, ricorrere a keybd_event () che viene gestito direttamente dal driver della tastiera. Ovviamente la finestra dovrà essere attiva

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top