从另一个线程最大化/最小化窗口

4
我正在尝试找到正确的方法来最小化/最大化另一个线程拥有的窗口。我的目标窗口可以是全屏或非全屏状态(无论其状态如何,我都应该能够将其最小化和最大化)。我尝试了各种组合的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;
}
2个回答

4
在整整一天的努力尝试后,我找到了一个解决方案,可以在窗口处于任何状态下都能最小化和最大化:使用Post/SendMessage
要最大化窗口:
PostMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);

为了最小化它:
PostMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);

3

首先尝试使用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);
        ...
    }
}

谢谢你的回复,但只在全屏时它才有效。当窗口化时,虽然已经调用了ShowWindow(hWnd, SW_RESTORE),但什么也没有发生。 - Tabaqui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接