Развернуть / свернуть окно из другого потока

Я пытаюсь найти правильный способ свернуть / развернуть окно, принадлежащее другому потоку. Мое целевое окно может быть полноэкранным или нет (я должен иметь возможность свернуть и развернуть его независимо от его состояния). Я пробовал различные комбинации ShowWindow SW_MINIMIZE, SW_MAXIMIZE, SW_FORCEMINIMIZE и т. Д., Но единственный результат, которого я смог достичь, — это восстановить его (максимизировать), когда он был свернут, и в полноэкранном режиме с ShowWindow(hWnd, SW_RESTORE),

Вот код, который я использую для получения моего дескриптора:

#include <Windows.h>
#include <iostream>

// I'm a console application
int main(int argc, char* argv[]) {
HWND hWnd = FindWindow(TEXT("MyWindowClass"), NULL);
if(IsWindow(hWnd)) {
std::cout << "Window found!" << std::endl;
SetForegroundWindow(hWnd); // I'll give focus to my window. This is always working.
if(IsIconic(hWnd))
ShowWindow(hWnd, SW_RESTORE); // This is working only if the window is minimized while in fullscreen mode
Sleep(3000);
ShowWindow(hWnd, SW_MINIMIZE); // Not working. SW_FORCEMINIMIZE, SW_HIDE etc are not working either.
}
return 0;
}

3

Решение

После целого дня борьбы я нашел решение, которое работает как для минимизации, так и для максимизации окна независимо от его состояния: Post/SendMessage,

Чтобы максимизировать это:

PostMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);

Чтобы минимизировать это:

PostMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
2

Другие решения

Пытаться ShowWindow сначала, а потом позвони SetForegroundWindow:

void show_and_setforeground(HWND hwnd)
{
WINDOWPLACEMENT place;
memset(&place, 0, sizeof(WINDOWPLACEMENT));
place.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hwnd, &place);

switch (place.showCmd)
{
case SW_SHOWMAXIMIZED:
ShowWindow(hwnd, SW_SHOWMAXIMIZED);
break;
case SW_SHOWMINIMIZED:
ShowWindow(hwnd, SW_RESTORE);
break;
default:
ShowWindow(hwnd, SW_NORMAL);
break;
}

SetForegroundWindow(hwnd);
}

В дополнение к IsWindow(hWnd) вы можете использовать IsWindowVisible(hWnd) потому что некоторые программы используют невидимые окна, которые не предназначены для использования.

hwnd = FindWindow(TEXT("MyWindowClass"), NULL);
if (IsWindow(hwnd))
{
if(IsWindowVisible(hwnd))//optional
{
show_and_setforeground(hwnd);
...
}
}
1

По вопросам рекламы [email protected]