web-dev-qa-db-fra.com

Comment envoyer des raccourcis clavier à une fenêtre sans avoir à l'activer à l'aide de l'API Windows?

J'ai déjà créé une application qui envoie des commandes à une fenêtre activée. Je souhaite pouvoir utiliser l'ordinateur pendant que mon processus est en cours d'exécution car dès que je passe au focus dans une autre fenêtre, les touches envoyées via les touches d'envoi sont dirigées vers la fenêtre dans laquelle je viens de basculer.

Actuellement, j'utilise FindWindow, IsIconic et ShowWindow à partir de l'API Windows. Je dois vérifier si la fenêtre est là avec FindWindow et définir mon objet sur la fenêtre spécifique renvoyée avec cet appel. Je vérifie ensuite s'il est minimisé avec IsIconic et appelle ShowWindow si c'est le cas, puis je dois appeler Interaction.AppActivate pour définir le focus sur cette fenêtre. Tout cela est fait avant même d’envoyer des touches. On dirait qu'il devrait y avoir un moyen d'envoyer simplement des touches sans avoir à afficher la fenêtre et à l'activer. Le gros problème, c'est que pendant que mon application exécute les touches du clavier, je ne peux rien faire sur mon ordinateur.

20
SlipToFall

Bon, c’est un peu décevant, j'en suis sûr, mais fondamentalement vous ne pouvez pas faire cela avec une fiabilité à 100%.

Windows suppose que la fenêtre active est celle qui reçoit les entrées au clavier. La bonne façon de simuler une saisie au clavier est avec SendInput , et vous remarquerez qu’il envoie des messages à la fenêtre active uniquement.

Cela dit, vous pouvez SendMessageWM_KEYUP , WM_CHAR , et WM_KEYDOWN messages et (selon le WndProc qui les reçoit) peut-être vous en sortir. Mais rappelez-vous, sa va se casser dans certaines circonstances, période.

29
Kevin Montrose

On dirait que vous utilisez keybd_event () ou SendInput (), qui envoient des frappes au clavier à la fenêtre actuellement active. Pour diriger les touches du clavier vers une fenêtre spécifique, que le widnow soit activé ou non, vous devez d'abord trouver son identificateur HWND, puis lui envoyer directement les messages WM_KEYUP/DOWN et WM_CHAR correctement formatés.

6
Remy Lebeau

une fois que vous avez la fenêtre HWND, vous pouvez directement envoyer à SendMessage () les messages WM_KEYDOWN et WM_KEYUP dans sa file de messages. La fenêtre ne doit pas nécessairement être active.

Toutefois, comprenez que cela dépend de la manière dont l'application cible traite les entrées au clavier. Il y a plusieurs façons de le gérer.

WM_KEYUP/WM_KEYDOWN est le plus courant et certaines applications ne traitent que l’un ou l’autre (généralement WM_KEYDOWN).

WM_CHAR est également assez commun

Certains programmes utilisent GetAsyncKeyState, GetKeyState ou GetKeyboardState. Ceci est extrêmement inhabituel, mais empêche efficacement l’injection de pression de touche avec SendMessage (). Si tel est le cas, revenez à keybd_event (), qui est directement géré par le pilote du clavier. Bien sûr la fenêtre devra être active 

1
Anthony Bachler