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

How to send keys to a minimized window in C++

本文关键字:最小化 窗口 密钥 C++      更新时间:2023-10-16

我刚刚开始学习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);
    }
    }
}

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;
}