循环未打印活动窗口

时间:2019-02-19 18:16:16

标签: c winapi

我有一个简单的周期,具有简单的窗口打印功能。

char temp[100], *currbuf= "", *currbuf2 = "";


while (1) {
    GetWindowText(GetForegroundWindow(), temp, sizeof temp / sizeof *temp);
    currbuf2 = temp;
    if (currbuf2 != currbuf) {
        currbuf = temp;
        printf("\n\nWindow title: %s\n", temp);
    };
};

问题是它仅打印第一个活动窗口的标题。 我想做的是每次更改活动窗口的标题。 如果没有if语句,它将运行良好(但仍会打印该活动窗口)。

1 个答案:

答案 0 :(得分:2)

  

问题是它只打印第一个活动窗口的标题。

您需要比较字符串 contents ,而不是字符串 pointers

char temp[100] = "", currbuf[100] = "";

while (1) {
    GetWindowText(GetForegroundWindow(), temp, sizeof temp / sizeof *temp);
    if (strcmp(currbuf, temp) != 0) {
        strcpy(currbuf, temp);
        printf("\n\nWindow title: %s\n", temp);
    }
}
  

我想要做的是每次更改活动窗口时都显示其标题。

您应该使用SetWinEventHook()来接收OS发出的EVENT_SYSTEM_FOREGROUND通知,而不是使用不断轮询活动窗口的无限循环。不要轮询(除非是在开始挂接之前的第一次)。

void displayWindowTitle(HWND hWnd)
{
    char temp[100] = "";
    GetWindowText(hWnd, temp, sizeof temp / sizeof *temp);
    printf("\n\nWindow title: %s\n", temp);
}

void CALLBACK MyHookCallback(HWINEVENTHOOK hook, DWORD event, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime)
{
    displayWindowTitle(hwnd);
}

...

displayWindowTitle(GetForegroundWindow());
HWINEVENTHOOK hHook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, NULL, &MyHookCallback, 0, 0, WINEVENT_OUTOFCONTEXT);
...
UnhookWinEvent(hHook);