1

我尝试创建一个窗口,当它最小化时它是隐藏的。当窗口最小化时,它应该被隐藏。我的问题在哪里?是什么阻止了 ShowWindow 工作?

#define _WIN32_WINNT 0x0600

#include <Windows.h>
#include <CommCtrl.h>
#pragma comment(lib,"ComCtl32.lib")
#include <tchar.h>
#include <stdlib.h>
#include <string>
#include "resource.h"
#pragma comment(linker, \
  "\"/manifestdependency:type='Win32' "\
  "name='Microsoft.Windows.Common-Controls' "\
  "version='6.0.0.0' "\
  "processorArchitecture='*' "\
  "publicKeyToken='6595b64144ccf1df' "\
  "language='*'\"")

//Fenster des Dialogs
HWND hDialog;

INT_PTR CALLBACK Func(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) {
    switch(uMsg) {
        case WM_SYSCOMMAND:
            if(wParam==SC_MINIMIZE) {
                ShowWindow(hDialog,SW_HIDE);
            }
            break;
        case WM_CLOSE:
            DestroyWindow(hwndDlg);
            return TRUE;
        case WM_DESTROY:
            DeregisterShellHookWindow(hDialog);
            PostQuitMessage(0);
            return TRUE;
    }
    return FALSE;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) {
    InitCommonControls();
    hDialog=CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,Func);
    SendMessage(hDialog,WM_SETICON,ICON_BIG,(LPARAM)LoadIcon(NULL,(LPCWSTR)IDI_APPLICATION));
    RegisterShellHookWindow(hDialog);
    ShowWindow(hDialog,SW_SHOWNORMAL);
    MSG msg={0};
    BOOL ret=0;
    while((ret = GetMessage(&msg, 0, 0, 0)) != 0) {
        if(ret==-1) {
            break;
        }
        if(!IsDialogMessage(hDialog,&msg)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return 0;
}
4

3 回答 3

1

您的对话过程FALSE在响应后返回WM_SYSCOMMAND。更改它以使其返回TRUE,这样它就不会运行默认操作,也不会最小化窗口。

wParam在这种情况下应该按位与反对0xFFF0

if((wParam & 0xFFF0) == SC_MINIMIZE) {
    ShowWindow(hwnd, SW_HIDE);
    return TRUE; //<- add this
}
break; //<- return false...

请参阅文档:

DLGPROC 回调函数
通常,如果对话框过程处理了消息,则返回 TRUE,否则返回 FALSE。如果对话框过程返回 FALSE,则对话框管理器执行默认对话框操作以响应消息。

WM_SYSCOMMAND
在 WM_SYSCOMMAND 消息中,系统内部使用 wParam 参数的四个低位。为了在测试 wParam 的值时获得正确的结果,应用程序必须使用按位与运算符将值 0xFFF0 与 wParam 值组合。

请注意,DialogBox此示例更好(它不需要消息循环)。如果必须使用CreateDialog,则按如下方式更改消息循环:

INT_PTR CALLBACK Func(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM) 
{
    switch(uMsg)
    {
    case WM_SYSCOMMAND:
        if((wParam & 0xFFF0) == SC_MINIMIZE)
        {
            ShowWindow(hwnd, SW_HIDE);
            return TRUE;
        }
        break;

    case WM_CLOSE:
        DestroyWindow(hwnd);
        return TRUE;
    }
    return FALSE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) 
{
    HWND hDialog = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, Func);
    ...
    while(GetMessage(&msg, NULL, 0, 0) && IsWindow(hDialog))
    {
        if(!IsDialogMessage(hDialog, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return 0;
}
于 2019-08-22T13:30:10.520 回答
0

如果 wParam 等于 SC_MINIMIZE 或 SC_RESTORE(使用 SW_HIDE 或 SW_RESTORE 作为 nCmdShow),则使用 ShowWindow 并在 Func 中返回 TRUE。

于 2019-08-21T12:42:55.687 回答
-1

你的意思是: ShowWindow(hDialog,SW_SHOWNORMAL) ?然后您需要将 SW_SHOWNORMAL 更改为其他值,例如 SW_MINIMIZE。

编辑:(找到它!)--我也看不到你在哪里初始化了 HWND hDialog 变量!?

您用于注册窗口的方法不能用于创建/注册窗口或类似的东西。请参阅: https ://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-registershellhookwindow

[此功能不适用于一般用途。它可能在 Windows 的后续版本中被更改或不可用。]

要创建一个窗口,您应该首先创建一个 Windows 系统类来注册您的消息处理和窗口过程。

HINSTANCE hinstance = GetModuleHandle(NULL); // NULL will give you the main
                                             // applications module handle.

WNDCLASSEX wc;

wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = wndProc; // window procedure
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hinstance;
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wc.hIconSm = wc.hIcon;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "YourSystemClassNameHere(not the window title)";
wc.cbSize = sizeof(WNDCLASSEX);

RegisterClassEx(&wc);

然后您可以创建 HWND。

HWND hwnd = CreateWindowEx(
        WS_EX_APPWINDOW | WS_EX_PALETTEWINDOW,
        "YourSystemClassNameHere(not the window title)",
        title,
        WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_POPUP | WS_CAPTION,
        positionX, positionX, width, height, NULL, NULL, hinstance, NULL);
于 2019-08-21T07:52:15.737 回答