2012-01-09 69 views
4

我刚开始学习C++。目前,我正处于一个小事情,我还找不到解决方案。我希望有人能帮助我解决这个问题。如何将密钥发送到C++中的最小化窗口

我的目标:我想发送几个击键到正在运行的应用程序。但是,当应用程序没有焦点,即最小化或以往任何时候,击键应仍然是 发送到应用程序。

我的问题:当我使用功能sendkey()VK_KEY或什么都(不记得笑),那么它是工作,但只有在窗口最大化(聚焦),但是当我尝试使用PostMessage(GameWindow, WM_KEYDOWN, 'G', 0);没有任何反应。

我在记事本上试过它,但也在我希望它工作但没有任何应用程序。我想我需要挂钩的过程,然后发送密钥,不幸的是我没有与C + +的问题(除非你完全亲lol),但我没有经验什么,所以从来没有钩和那种东西。

任何人都可以发送我正确的方向,或给我写一个关于如何做这样的事情,例如与Windows游戏之一的小教程?

if(amount != 0) 
{ 
    // bring the window to the front 
    HWND GameWindow = FindWindow(0, L"Naamloos - Kladblok"); 
    SetForegroundWindow(GameWindow); 

    // execute the loop 
    for(int i = 0; i < amount; i++){ 
    // not the last loop so add a pause at the end 
    if(i < (amount-1)) 
    { 
     PostMessage(GameWindow, WM_KEYDOWN, 'G', 0); 
     PostMessage(GameWindow, WM_KEYUP, 'G', 0); 
     Sleep(2000); 
    } 
    // last loop so dont add a pause at the end 
    else 
    { 
     PostMessage(GameWindow, WM_KEYDOWN, 'G', 0); 
     PostMessage(GameWindow, WM_KEYUP, 'G', 0); 
    } 
    } 
} 
+2

您不检查错误。你确定'FindWindow'成功了吗?像这样的'SetForegroundWindow'将不起作用。请阅读文档:http://msdn.microsoft.com/en-us/library/windows/desktop/ms633539(v=vs.85).aspx – 2012-01-09 00:14:02

+0

感谢您的回复!是的,它正在工作,我看到记事本窗口弹出,当我使用sendkeys而不是像PostMessage的其他东西,它确实工作正常;)因此,代码是正确的,它只是PostMessage不会做一件事; ; – user1137770 2012-01-09 00:50:08

+0

那么,有时你可以像这样伪造输入,有时它不起作用。您可以尝试在记事本中定位编辑窗口。但至于你知道的游戏。如果你解释了为什么你试图对游戏进行虚假输入,也许我们可以做得更好。 – 2012-01-09 01:09:42

回答

3

Win32应用程序对Windows消息的行为方式完全由其自行决定。所以它可能是你的目标窗口/应用程序正在接收消息,只是选择忽略它们。您可以使用Microsoft Spy ++(随Visual Studio提供)来观察目标应用程序消息队列并查看它收到的内容。

记事本(v5.1)选择听取WM_CHAR消息(而不是WM_KEYDOWN/WM_KEYUP),即使在最小化(示例代码如下)时它的价值。

#include "stdafx.h" 
#include "Windows.h" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    HWND hwndWindowTarget; 
    HWND hwndWindowNotepad = FindWindow(NULL, L"Untitled - Notepad"); 
    if (hwndWindowNotepad) 
    { 
     // Find the target Edit window within Notepad. 
     hwndWindowTarget = FindWindowEx(hwndWindowNotepad, NULL, L"Edit", NULL); 
     if (hwndWindowTarget) 
     { 
      PostMessage(hwndWindowTarget, WM_CHAR, 'G', 0); 
     } 
    } 

    return 0; 
} 
+0

如果进程没有子窗口,例如' “编辑”'? – Acidic 2017-09-11 23:35:09