Я пытаюсь найти правильный способ свернуть / развернуть окно, принадлежащее другому потоку. Мое целевое окно может быть полноэкранным или нет (я должен иметь возможность свернуть и развернуть его независимо от его состояния). Я пробовал различные комбинации 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;
}
После целого дня борьбы я нашел решение, которое работает как для минимизации, так и для максимизации окна независимо от его состояния: Post/SendMessage
,
Чтобы максимизировать это:
PostMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
Чтобы минимизировать это:
PostMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
Пытаться 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);
...
}
}