如何在C ++中将密钥发送到最小化窗口

时间:2012-01-09 00:09:54

标签: c++ windows winapi

我刚开始学习C ++。目前我堆叠在一个小东西,我找不到解决方案。我希望有人可以帮我解决这个问题。

我的目标:我想向正在运行的应用程序发送几次击键。但是当应用程序没有焦点,即最小化或者什么如此,键击应该仍然是 发送到应用程序。

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

我在记事本上尝试过,但也在我想让它工作的应用程序上尝试但没有。

我认为我需要挂钩进程然后发送密钥,不幸的是我对C ++没有任何问题(除非你完全没有问题)但是我没有经历任何关于钩子和那种东西的经历。 / p>

任何人都可以向我发送正确的方向,或者给我一个关于如何做这样的事情的小教程,例如使用其中一个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);
    }
    }
}

1 个答案:

答案 0 :(得分:3)

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

值得注意的是,Notepad(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;
}