2009-09-12 9 views
0

J'essaie d'envoyer une séquence de touches à une autre application. Je peux trouver le handle de fenêtre avec succès car l'utilisation de SendMessage a fonctionné exactement comme prévu.PostMessage pour les messages d'application croisée

Toutefois, lorsque j'ai basculé SendMessage sur PostMessage, l'application n'a plus reçu les messages.

J'ai cependant trouvé une solution de contournement en utilisant HWND_BROADCAST comme handle de fenêtre, et cela fonctionne bien, mais ce n'est pas la solution idéale.

Ce que je demande est, j'ai un hWnd valide, comment puis-je lui envoyer des messages en utilisant PostMessage et non SendMessage?

Modifier C'est ce que j'essaie de faire.

HWND Target = FindWindow(0, "Window Title Goes Here"); 
LPARAM lParam = (1 | (57<<16)); // OEM Code and Repeat for WM_KEYDOWN 
WPARAM wParam = VK_SPACE; 
PostMessage(HWND_BROADCAST, WM_KEYDOWN, wParam, lParam); // Works 
PostMessage(Target, WM_KEYDOWN, wParam, lParam); // Doesn't Work 
SendMessage(Target, WM_KEYDOWN, wParam, lParam); // Works, but I need Post 
+0

quel message vous envoyez des messages et quels sont les params? – dkackman

+0

Quel système d'exploitation? HWND_BROADCAST, il ne peut pas poster de message dans la fenêtre enfant. – adatapost

+0

Quelle est la valeur de retour de GetLastError() après le PostMessage? –

Répondre

1

La fonction PostMessage ne fonctionne pas lorsque le nombre de messages entre 0 et -1 WM_USER. Utilisez la fonction RegisterWindowMessage pour enregistrer vos propres messages.

0

Les messages envoyés et les messages postés prennent des routeurs complètement différents. La cible reçoit votre message envoyé, soit en le filtrant, soit en l'envoyant à une autre fenêtre. Il arrive à faire ce qu'il veut avec lui. Lorsque vous envoyez les messages, il va directement à la procédure de fenêtre sans filtrage, il est donc très probable que la cause de ce problème.

Je ne sais pas pourquoi HWND_BROADCAST fonctionne; ma meilleure estimation est qu'une fenêtre autre que Target traite le message. Ou peut-être même être envoyé dans une autre fenêtre que Target. (Vous vous rendez compte que HWND_BROADCAST envoie les messages à chaque fenêtre de niveau supérieur)

Il y a une fonction API Win32 conçu pour envoyer des données, SendInput(), qui place les messages dans la file d'entrée comme appui d'une touche. Cependant cela ne vous permet pas de spécifier une fenêtre, il envoie son entrée à la fenêtre active. Pour l'utiliser, vous devez activer et basculer le focus sur Cible, ce qui signifie que l'utilisateur verrait cette fenêtre se déplacer vers le haut (comme vous l'avez fait avec Alt-Tabbed). Le long de cette même route, VBScript a une fonction SendKeys() qui fait la même chose, mais qui est plus facile à utiliser. Pour finir, vous pouvez utiliser SendMessageCallback() qui vous donnera le comportement d'un SendMessage asynchrone, ce que je suppose que vous voulez. (Et est différent de PostMessage Les messages postés vont dans la file d'attente des messages envoyés, les messages envoyés sont envoyés directement)

0

* Pour le lparam allez ici http://msdn.microsoft.com/en-us/library/ms646280%28v=vs.85%29.aspx, changez les 32 bits (31 ... 3 2 1 0) de lParam . Une fois que vous avez la phrase binaire que vous voulez pour vos paramètres (cRepeat, Scancode etc), convertissez-le en hexadécimal.

essayez ceci:

void SendString(HWND h, char *text) 
{ 
    int len = strlen(text); 
    for(int i = 0; i < len; i++) 
    PostMessage(h, WM_CHAR, text[i], 0); 
} 



HWND Target = FindWindow(0, "Window Title Goes Here"); 
LPARAM lParam = //The hexadecimal value matching with the parameters you want* example 0x29A1. 
WPARAM wParam = VK_SPACE; 
PostMessage(HWND_BROADCAST, WM_KEYDOWN, wParam, lParam); 
PostMessage(Target, WM_KEYDOWN, wParam, lParam); 
SendString(Target, (char*)"themessageyouwant\n"); 
Questions connexes