var
Info: TGUIThreadInfo;
begin
...
Info.cbSize := SizeOf(Info);
if GetGUIThreadInfo(GetWindowThreadProcessId(ForeWnd), Info) then
...
end;
GetGUIThreadInfo возвращает нули
Код:
При просмотре отладчиком вижу, что в Info сплошные нули. Поскольку перехватывается активное окно, пробовал запускать без отладчика и выводить результаты MessageBox-ом -- то же самое. Что не так?
Если запустить программу из-под администратора, иногда возвращаются ненулевые значения. :facepalm: Мне по-любому нужно, чтобы работало из-под обычного пользователя.
Разрабатывается и проверяется на Windows XP из-под профиля с правами "Опытный пользователь".
Код:
////////////////////////////////////////////////////////////
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);
//////////////////////////////////////////////////////////////
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 под учетной записью с правами "Обычный пользователь".
Альтернативный вариант: сделать поиск элемента с фокусом в своем процессе самостоятельно. Инициировать этот поиск из другого процесса с помощью собственного сообщения (WM_USER_blabla).
Цитата: hardcase
Инициировать этот поиск из другого процесса с помощью собственного сообщения (WM_USER_blabla).
Чужой процесс = произвольный процесс. Если бы я писал оба процесса сам, уж как-то смог бы договориться.