SetWinEventHook的WINEVENT_SKIPOWNPROCESS确实不起作用

时间:2018-12-19 14:34:36

标签: c++ windows winapi

我对当前焦点窗口的窗口标题感兴趣。我现在有了这段基本有效的代码:

#include <iostream>
#include <Windows.h>

using namespace std;


void CALLBACK myCallback(HWINEVENTHOOK hWinEventHook,
      DWORD event,
      HWND hwnd,
      LONG idObject,
      LONG idChild,
      DWORD idEventThread,
      DWORD dwmsEventTime) {
    int windowTitleLength = GetWindowTextLengthA(hwnd);
    const int bufferSize = windowTitleLength + 2;
    LPSTR windowTitleBuffer = new char[bufferSize];
    GetWindowTextA(hwnd, windowTitleBuffer, bufferSize);
    cout << "Title: " << windowTitleBuffer << endl;
    delete[] windowTitleBuffer;
}

void setup() {
    SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, NULL, myCallback, 0, 0,
        WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
}

int main()
{
    bool bRet;
    MSG myMsg;
    setup();
    while (bRet = GetMessage(&myMsg, NULL, 0, 0) != 0)
    {
        if (bRet == -1) {
            cout << "ABANDON SHIP!" << endl;
        }
        cout << "Got a message!" << endl;
    }
}

顺便说一句,这是我尝试在c ++中实现我在nodejs here中未能实现的目标。

窗口标题将按预期方式打印,直到我明确聚焦小程序的终端窗口为止。它打印自己的标题,然后冻结。聚焦其他窗口不会显示任何内容,直到我在控制台中按 Ctrl + C 然后释放了程序内存中所有存储的能量并重新开始工作。

现在,当我将WINEVENT_SKIPOWNPROCESS标志指定为SetWinEventHook时,为什么不为自己的程序控制台窗口调用回调。也许是因为控制台实际上不是窗口

关于此代码的第二个问题是GetMessage函数,无论我的程序收到多少事件,该函数仅被调用一次,这对我来说没有意义,因为我希望每个事件都被调用一次事件已收到。

此外,也许是由于上述原因,while循环主体永远不会执行。

如何使该程序不因自身事件而窒息?

0 个答案:

没有答案