@Limons

Как пользоваться функцией EnumWindows?

Вот код:
static BOOL CALLBACK enumWindowCallback(HWND func_hWnd, LPARAM lparam) {
  int length = GetWindowTextLength(func_hWnd);

  TCHAR* buffer;
  char* buffer = new char[length + 1];
  GetWindowText(hWnd, buffer, length + 1);
  string windowTitle(buffer);


  if (length != 0) {
    std::cout << func_hWnd << ":  " << windowTitle << std::endl;
  }
  return TRUE;
}


Что не так?
  • Вопрос задан
  • 1056 просмотров
Пригласить эксперта
Ответы на вопрос 2
@none7
#include <Windows.h>
#include <string>
#include <iostream>

using namespace std;

static BOOL CALLBACK enumWindowCallback(HWND func_hWnd, LPARAM lparam) {
    int length = GetWindowTextLengthA(func_hWnd);

    if (length != 0) {
        string windowTitle(length, '\0');
        GetWindowTextA(func_hWnd, windowTitle.data(), length + 1); // ANSI version and func_hWnd
        std::cout << func_hWnd << ":  " << windowTitle << std::endl;
    }
    return TRUE;
}

int main() {
    SetConsoleOutputCP(GetACP());
    EnumWindows((WNDENUMPROC)enumWindowCallback, 0);
    system("pause");
    return 0;
}
Ответ написан
@User700
Переменная buffer объявлена два раза. Делаете new без delete -- утечка памяти. Я бы этот момент реализовал наподобие такого:
string title(length, '\0');
GetWindowText(hWnd, (char*)(title.data()), length+1);

И buffer тогда не надо.
В некоторых стандартах data возвращает не конст. указатель, но проще явно привести (см. также const_cast).
Но понятно ли, что это только колбэк для функции. Вы должны вызвать саму ф-ию WinAPI, передав ей свой колбэк.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы