Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

GetGUIThreadInfo возвращает нули

10
10 января 2012 года
Freeman
3.2K / / 06.03.2004
Пытаюсь получить фокус у произвольного окна из своей программы -- другого процесса:
 
Код:
var
  Info: TGUIThreadInfo;
begin
  ...
  Info.cbSize := SizeOf(Info);
  if GetGUIThreadInfo(GetWindowThreadProcessId(ForeWnd), Info) then
    ...
end;

При просмотре отладчиком вижу, что в Info сплошные нули. Поскольку перехватывается активное окно, пробовал запускать без отладчика и выводить результаты MessageBox-ом -- то же самое. Что не так?

Если запустить программу из-под администратора, иногда возвращаются ненулевые значения. :facepalm: Мне по-любому нужно, чтобы работало из-под обычного пользователя.

Разрабатывается и проверяется на Windows XP из-под профиля с правами "Опытный пользователь".
20K
10 января 2012 года
sem2711
124 / / 23.09.2009
Если я правильно понял, то основная проблема в том, что не заполняется структура GUITHREADINFO. Вот работающий код на C:
Код:
////////////////////////////////////////////////////////////
    HWND hForeWnd;      // Хэндл активного окна
    GUITHREADINFO info; // Структура с информацией о потоке.
    DWORD threadID;     // ID потока интересующего окна.
    DWORD currThreadID; // ID текущего потока.
    TCHAR mes[128];     // Строковый буфер для вывода сообщения.
    ////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////
    // 2 секунды требуются для переключения на другое окно.
    Sleep(2000);
    SecureZeroMemory(&info, sizeof(info));
    info.cbSize = sizeof(info);
    hForeWnd = FindWindow(NULL, TEXT("..."));
    threadID = GetWindowThreadProcessId(hForeWnd, NULL);
    currThreadID = GetCurrentThreadId();

    AttachThreadInput(currThreadID, threadID, TRUE);
    GetGUIThreadInfo(threadID, &info);
    AttachThreadInput(currThreadID, threadID, FALSE);

    StringCchPrintf(mes, 128, TEXT("Window handle with keyboard focus: %d"), info.hwndFocus);
    MessageBox(NULL, mes, NULL, 0);
    //////////////////////////////////////////////////////////////

Тестировал на Win7 Home Basic под учетной записью с правами "Обычный пользователь".
5
10 января 2012 года
hardcase
4.5K / / 09.08.2005
Альтернативный вариант: сделать поиск элемента с фокусом в своем процессе самостоятельно. Инициировать этот поиск из другого процесса с помощью собственного сообщения (WM_USER_blabla).
10
11 января 2012 года
Freeman
3.2K / / 06.03.2004
Решение sem2711 оказалось верным: надо вызывать AttachThreadInput до и после GetGUIThreadInfo. Читал ведь в MSDN про обе функции, но сопоставить почему-то не смог.

Цитата: hardcase
Инициировать этот поиск из другого процесса с помощью собственного сообщения (WM_USER_blabla).


Чужой процесс = произвольный процесс. Если бы я писал оба процесса сам, уж как-то смог бы договориться.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог