Не удается активировать окно, SetActiveWindow
От: Ambianx Украина  
Дата: 10.11.11 10:18
Оценка:
[Windows 7, MVS 2010]

Не удается активировать окно с помощью функции SetActiveWindow().

The SetActiveWindow function activates a window. The window must be attached to the calling thread's message queue.

By using the AttachThreadInput function, a thread can attach its input processing to another thread. This allows a thread to call SetActiveWindow to activate a window attached to another thread's message queue.


Имеется окно под многими остальными на рабочем столе. Задача — вывести его "наверх" и активировать. Следующий код не работает в конфигурации Release, но работает в Debug:


DWORD idAttach = GetWindowThreadProcessId(hwnd, &pid);
DWORD idAttachTo = GetCurrentThreadId();
bRes = AttachThreadInput(idAttach, idAttachTo, TRUE);
HWND hWndPrev = SetActiveWindow(hwnd);
AttachThreadInput(idAttach, idAttachTo, FALSE);


Т.е., при отладке нужное окно удается "вытащить" наверх активированным, а в релизе никакой реакции.
Если заменить весь вышеприведенный код одним вызовом SetForegroundWindow(hwnd), то окно просто начинает мигать в трее.
Re: Не удается активировать окно, SetActiveWindow
От: okman Беларусь https://searchinform.ru/
Дата: 10.11.11 11:00
Оценка:
Здравствуйте, Ambianx, Вы писали:

A>Не удается активировать окно с помощью функции SetActiveWindow().


Я использовал пару BringWindowToTop + SetForegroundWindow.
Еще можно SetWindowPos попробовать с разными флагами.
Re[2]: Не удается активировать окно, SetActiveWindow
От: Ambianx Украина  
Дата: 10.11.11 11:02
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, Ambianx, Вы писали:


A>>Не удается активировать окно с помощью функции SetActiveWindow().


O>Я использовал пару BringWindowToTop + SetForegroundWindow.

O>Еще можно SetWindowPos попробовать с разными флагами.

Спасибо, попробую.
Re[3]: Не удается активировать окно, SetActiveWindow
От: Ambianx Украина  
Дата: 10.11.11 11:13
Оценка:
Здравствуйте, Ambianx, Вы писали:

A>Здравствуйте, okman, Вы писали:


O>>Здравствуйте, Ambianx, Вы писали:


A>>>Не удается активировать окно с помощью функции SetActiveWindow().


O>>Я использовал пару BringWindowToTop + SetForegroundWindow.

O>>Еще можно SetWindowPos попробовать с разными флагами.

A>Спасибо, попробую.


Самостоятельный вызов BringWindowToTop(hwnd) не делает ничего.


DWORD idAttach = GetWindowThreadProcessId(hwnd, &pid);
DWORD idAttachTo = GetCurrentThreadId();
AttachThreadInput(idAttach, idAttachTo, TRUE);
BringWindowToTop(hwnd);
AttachThreadInput(idAttach, idAttachTo, FALSE);


— работает, но, опять таки, только в Debug-конфигурации.
Re[3]: Не удается активировать окно, SetActiveWindow
От: Ambianx Украина  
Дата: 10.11.11 11:19
Оценка:
Здравствуйте, Ambianx, Вы писали:

A>Здравствуйте, okman, Вы писали:


O>>Здравствуйте, Ambianx, Вы писали:


A>>>Не удается активировать окно с помощью функции SetActiveWindow().


O>>Я использовал пару BringWindowToTop + SetForegroundWindow.

O>>Еще можно SetWindowPos попробовать с разными флагами.

A>Спасибо, попробую.


Вызов 2 функций работает, но только в Debug, т.е., такой код, без использования Attach-а:


BringWindowToTop(hwnd);
SetForegroundWindow(hwnd);
Re: Не удается активировать окно, SetActiveWindow
От: rus blood Россия  
Дата: 10.11.11 11:24
Оценка:
Здравствуйте, Ambianx, Вы писали:

A>Т.е., при отладке нужное окно удается "вытащить" наверх активированным, а в релизе никакой реакции.

A>Если заменить весь вышеприведенный код одним вызовом SetForegroundWindow(hwnd), то окно просто начинает мигать в трее.

И это очень хорошо.
Пользователь сам решит, нужно ему обращать внимание на твое окно или нет.

А вообще, здесь и здесь еще
Автор: IPv6
Дата: 21.06.04
Имею скафандр — готов путешествовать!
Re[2]: Не удается активировать окно, SetActiveWindow
От: Ambianx Украина  
Дата: 10.11.11 12:54
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Здравствуйте, Ambianx, Вы писали:


A>>Т.е., при отладке нужное окно удается "вытащить" наверх активированным, а в релизе никакой реакции.

A>>Если заменить весь вышеприведенный код одним вызовом SetForegroundWindow(hwnd), то окно просто начинает мигать в трее.

RB>И это очень хорошо.

RB>Пользователь сам решит, нужно ему обращать внимание на твое окно или нет.

RB>А вообще, здесь и здесь еще
Автор: IPv6
Дата: 21.06.04


По первой ссылке "Способ №3" не работает(мигание окна в панели задач):

HWND hCurrWnd = GetForegroundWindow();
DWORD idAttachTo = GetWindowThreadProcessId(hCurrWnd, NULL);
DWORD idAttach = GetCurrentThreadId();
AttachThreadInput(idAttach, idAttachTo, TRUE);
SetForegroundWindow(hwnd);
AttachThreadInput(idAttach, idAttachTo, FALSE);
Re[2]: Не удается активировать окно, SetActiveWindow
От: Ambianx Украина  
Дата: 10.11.11 13:22
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Здравствуйте, Ambianx, Вы писали:


A>>Т.е., при отладке нужное окно удается "вытащить" наверх активированным, а в релизе никакой реакции.

A>>Если заменить весь вышеприведенный код одним вызовом SetForegroundWindow(hwnd), то окно просто начинает мигать в трее.

RB>И это очень хорошо.

RB>Пользователь сам решит, нужно ему обращать внимание на твое окно или нет.

RB>А вообще, здесь и здесь еще
Автор: IPv6
Дата: 21.06.04


По второй ссылке тоже не работает:


SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, (WPARAM) SC_HOTKEY, (LPARAM) hwnd);
Re[3]: Не удается активировать окно, SetActiveWindow
От: rus blood Россия  
Дата: 10.11.11 13:28
Оценка:
Здравствуйте, Ambianx, Вы писали:

A>
A>HWND hCurrWnd = GetForegroundWindow();
A>DWORD idAttachTo = GetWindowThreadProcessId(hCurrWnd, NULL);
A>DWORD idAttach = GetCurrentThreadId();
A>AttachThreadInput(idAttach, idAttachTo, TRUE);


У тебя в первом посте был такой код
DWORD idAttach = GetWindowThreadProcessId(hwnd, &pid);
DWORD idAttachTo = GetCurrentThreadId();
bRes = AttachThreadInput(idAttach, idAttachTo, TRUE);


Параметры у AttachThreadInput в разном порядке.
Имею скафандр — готов путешествовать!
Re[4]: Не удается активировать окно, SetActiveWindow
От: Ambianx Украина  
Дата: 10.11.11 15:00
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Здравствуйте, Ambianx, Вы писали:


A>>
A>>HWND hCurrWnd = GetForegroundWindow();
A>>DWORD idAttachTo = GetWindowThreadProcessId(hCurrWnd, NULL);
A>>DWORD idAttach = GetCurrentThreadId();
A>>AttachThreadInput(idAttach, idAttachTo, TRUE);
RB>


RB>У тебя в первом посте был такой код

RB>
RB>DWORD idAttach = GetWindowThreadProcessId(hwnd, &pid);
RB>DWORD idAttachTo = GetCurrentThreadId();
RB>bRes = AttachThreadInput(idAttach, idAttachTo, TRUE);
RB>


RB>Параметры у AttachThreadInput в разном порядке.


Это два разных способа. Способ в первом примере описан в этой теме под №3. Способ же, который я привел в заголовке темы, исходит из описания функции SetActiveWindow() в MSDN:

The window must be attached to the calling thread's message queue.

Сокращенно может быть записан так:

AttachThreadInput(GetWindowThreadProcessId(hwnd, NULL), GetCurrentThreadId(), TRUE);
SetActiveWindow(hwnd);
AttachThreadInput(GetWindowThreadProcessId(hwnd, NULL), GetCurrentThreadId(), FALSE);


Может, все-таки, правильно так:

AttachThreadInput(GetCurrentThreadId(), GetWindowThreadProcessId(hwnd, NULL), TRUE);
SetActiveWindow(hwnd);
AttachThreadInput(GetCurrentThreadId(), GetWindowThreadProcessId(hwnd, NULL), FALSE);


?

Хотя программа ведет себя одинаково, что странно, в обоих случаях.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.