Как остановить запуск EnumWindows бесконечно win32 - PullRequest
3 голосов
/ 28 апреля 2009

Код работал все время. Каким-то образом мне удается заставить Visual C ++ Express не достигать точки останова в последнем операторе возврата, и он, кажется, работает вечно.

В приведенном ниже примере кода EnumWindows перечисляет бесконечно. Как можно остановить его после того, как были перечислены все окна.

#include <Windows.h>

BOOL CALLBACK EnumWindowsProc(HWND hWnd, long lParam) {
    TCHAR buff[255];

    if (IsWindowVisible(hWnd)) {
        GetWindowText(hWnd, (LPWSTR) buff, 254);
        printf("%S\n", buff);
    }
    return TRUE;
}

int _tmain(int argc, _TCHAR* argv[]) {
    EnumWindows(EnumWindowsProc, 0);
    return 0;
}

Ответы [ 4 ]

8 голосов
/ 28 апреля 2009

Ваш код работает для меня, как только я удалил широкие символы и добавил #include <stdio.h>, чтобы получить объявление printf (). Какой вывод он производит в вашей системе?

Код, который работает для меня:

#include <windows.h>
#include <stdio.h>

BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {
    char buff[255];

    if (IsWindowVisible(hWnd)) {
        GetWindowText(hWnd, (LPSTR) buff, 254);
        printf("%s\n", buff);
    }
    return TRUE;
}

int main() {
    EnumWindows(EnumWindowsProc, 0);
    return 0;
}
3 голосов
/ 28 апреля 2009

EnumWindowsProc никогда не должно работать бесконечно.

Он должен работать до:

  • Ваш обратный вызов возвращает ЛОЖЬ
  • Больше нет окон верхнего уровня для перечисления

Так что я подозреваю, что он работает для вас бесконечно из-за повреждения памяти или нарушения доступа к памяти.

Ваш printf должен использовать% s, а не% S.

BOOL CALLBACK EnumWindowsProc(HWND hWnd, long lParam) {
    TCHAR buff[255];

    if (IsWindowVisible(hWnd)) {
        GetWindowText(hWnd, (LPWSTR) buff, 254);
        printf("%s\n", buff);//<--- %s means use TCHAR* which is WCHAR* in your case
    }
    return TRUE;
}

Также вам не нужно использовать ваш бафф как LPWSTR. Если ваш бафф каким-то образом является буфером CHAR, то вам нужно скомпилировать с набором символов Unicode.

1 голос
/ 28 апреля 2009

хм, я не понимаю, почему это так. Я запустил его, и он работал просто отлично. он отобразил все окна, которые у меня есть, а затем остановился. enumWindows остановится, когда enumWindowsProc вернет false (у вас есть код, который всегда возвращает true), или когда у него заканчиваются окна верхнего уровня для перечисления. -don

1 голос
/ 28 апреля 2009

Из документации:

EnumWindows продолжается до тех пор, пока не будет перечислено последнее окно верхнего уровня или пока функция обратного вызова не вернет FALSE.

Чтобы продолжить перечисление, функция обратного вызова должна вернуть TRUE; чтобы остановить перечисление, он должен вернуть FALSE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...