我对当前焦点窗口的窗口标题感兴趣。我现在有了这段基本有效的代码:
#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
循环主体永远不会执行。
如何使该程序不因自身事件而窒息?