Сообщение Re[6]: Переместить окно поверх других. от 03.11.2016 10:08
Изменено 03.11.2016 10:10 Carc
Здравствуйте, VTT, Вы писали:
VTT>Легальный метод — это AllowSetForegroundWindow / SetForegroundWindow.
VTT>Все остальные — это workaround / hack.
Ну вот вам функция, которая дергается по таймеру. Всплывает мое окно как миленькое, и фокус себе забирает у кого хочешь. Но как говорил, все будет зависеть от прав: если успешно отработает AttachThreadInput к чужому потоку.
VTT>Легальный метод — это AllowSetForegroundWindow / SetForegroundWindow.
VTT>Все остальные — это workaround / hack.
Ну вот вам функция, которая дергается по таймеру. Всплывает мое окно как миленькое, и фокус себе забирает у кого хочешь. Но как говорил, все будет зависеть от прав: если успешно отработает AttachThreadInput к чужому потоку.
const HWND hwnd=::GetForegroundWindow();//кто у нас фореграунд-окно сейчас
DWORD pid =0;
//получаем ThreadID и ProcessID окна на переднем плане
const DWORD tid=::GetWindowThreadProcessId(hwnd,&pid);
//если окно переднего плана и так наше, ту хулио нам хулио (ц) - мы и без атача всё можем
if (GetCurrentProcessId() == pid)
return;
//подключаемся к очереди ввода, но тут могет быть неудача - из-за безопасности Windows
if (AttachThreadInput(GetCurrentThreadId(), tid,TRUE)) {
//ага, мль подключилися значитъ - не поехали тогда
::SetForegroundWindow(m_hWnd);
::SetActiveWindow(m_hWnd);
::SetFocus(m_hWnd);
//отключаемся от очереди ввода к чужому окошецу
AttachThreadInput(GetCurrentThreadId(), tid,FALSE);
}
Здравствуйте, VTT, Вы писали:
VTT>Легальный метод — это AllowSetForegroundWindow / SetForegroundWindow.
VTT>Все остальные — это workaround / hack.
Ну вот вам функция, которая дергается по таймеру. Всплывает мое окно как миленькое, и фокус себе забирает у кого хочешь. Но как говорил, все будет зависеть от прав: если успешно отработает AttachThreadInput к чужому потоку.
VTT>Легальный метод — это AllowSetForegroundWindow / SetForegroundWindow.
VTT>Все остальные — это workaround / hack.
Ну вот вам функция, которая дергается по таймеру. Всплывает мое окно как миленькое, и фокус себе забирает у кого хочешь. Но как говорил, все будет зависеть от прав: если успешно отработает AttachThreadInput к чужому потоку.
const HWND hwnd=::GetForegroundWindow();//кто у нас фореграунд-окно сейчас
DWORD pid =0;
//получаем ThreadID и ProcessID окна на переднем плане
const DWORD tid=::GetWindowThreadProcessId(hwnd,&pid);
//если окно переднего плана и так наше, ту хулио нам хулио (ц) - мы и без атача всё можем
if (GetCurrentProcessId() == pid)
return;
//подключаемся к очереди ввода, но тут могет быть неудача - из-за безопасности Windows
if (AttachThreadInput(GetCurrentThreadId(), tid,TRUE)) {
//ага, мль подключилися значитъ - ну поехали тогда
::SetForegroundWindow(m_hWnd);
::SetActiveWindow(m_hWnd);
::SetFocus(m_hWnd);
//отключаемся от очереди ввода к чужому окошецу
AttachThreadInput(GetCurrentThreadId(), tid,FALSE);
}