c++ - 如何在 C++ 中将键发送到最小化窗口

标签 c++ windows winapi

我刚刚开始学习 C++。目前我正忙于一件我还找不到解决办法的小事。我希望有人能帮助我解决这个问题。

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

我的问题:当我将函数 sendkey()VK_KEY 或其他任何东西一起使用时(不记得了,哈哈)然后它可以工作,但只有当窗口是最大化(集中),但是当我尝试使用 PostMessage(GameWindow, WM_KEYDOWN, 'G', 0); 时没有任何反应。

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

我想我需要 Hook 到进程然后发送 key ,不幸的是我对 C++ 没有问题(除非你完全赞成大声笑)但是我对 Hook 和那种东西没有任何经验。

任何人都可以向我发送正确的方向或给我写一个关于如何做这样的事情的小教程,例如使用其中一个 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 一起提供)来监视目标应用消息队列并查看它接收到的内容。

就其值(value)而言,记事本 (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;
}

关于c++ - 如何在 C++ 中将键发送到最小化窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8782648/

相关文章:

c++ - 在 C++ 中使用隐式转换进行复制初始化

c++ - 以编程方式找出 openCL 设备支持的最大工作组大小

python - vlc python 绑定(bind) - 如何接收键盘输入?

windows - .BAT 文件中未读取 SET 变量

c - 获取包含十六进制值的 LPTSTR 或 CHAR* 的大小

c - 如何使用 CreateThread() 创建多个线程,每个线程具有不同的 ThreadProc() 函数

c++ - 连接 2 QTableWidget 中的行选择

c++ - 未定义对 cv::Tracker::update 的引用

c++ - 如何判断屏幕保护程序是否被暂时禁用?

c++ - 如何使用 std::thread 逐行像素多线程?