Информация об изменениях

Сообщение Re[6]: Переместить окно поверх других. от 03.11.2016 10:08

Изменено 03.11.2016 10:10 Carc

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


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 к чужому потоку.
    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);
    }