Windows 使用WM_SHOWWINDOW来显示窗口,而不是SHOWWINDOW()

Windows 使用WM_SHOWWINDOW来显示窗口,而不是SHOWWINDOW(),windows,winapi,sendmessage,windows-messages,Windows,Winapi,Sendmessage,Windows Messages,我正在尝试使用热键实用程序(或NirCMD等)的SendMessage函数来获得一个隐藏窗口。例如,我可以通过发送0x0010(WM_close)来关闭窗口,但是当我尝试发送wParam为1、lParam为0的0x0018(WM_SHOWWINDOW)时,什么也没有发生 我环顾四周,有人抱怨WM_SHOWWINDOW不起作用的几个地方,他们很高兴地接受了使用SHOWWINDOW()的建议 但是,我没有可用的ShowWindow();我只能发送Windows消息。但是ShowWindow()并不是

我正在尝试使用热键实用程序(或NirCMD等)的SendMessage函数来获得一个隐藏窗口。例如,我可以通过发送0x0010(WM_close)来关闭窗口,但是当我尝试发送wParam为1、lParam为0的0x0018(WM_SHOWWINDOW)时,什么也没有发生

我环顾四周,有人抱怨WM_SHOWWINDOW不起作用的几个地方,他们很高兴地接受了使用SHOWWINDOW()的建议

但是,我没有可用的ShowWindow();我只能发送Windows消息。但是ShowWindow()并不是魔术,它通过在封面下发送WM_ShowWindow或其他东西来工作

如何通过发送消息使窗口显示自身


谢谢。

WM\u SHOWWINDOW是通知,而不是命令。从MSDN:

WM_SHOWWINDOW消息在窗口即将隐藏或显示时发送到窗口


我不相信有任何信息,你可以用来让一个窗口显示自己。事实上,这个想法对我来说有点奇怪。窗口管理器是负责显示和隐藏窗口的系统组件。要显示窗口,必须使用窗口管理器API之一。

尝试以下两条消息:

SendMessage(h,WM_SYSCOMMAND,SC_MINIMIZE,0);
SendMessage(h,WM_SYSCOMMAND,SC_RESTORE,0);

或者,如果可以使用第三方应用程序,请尝试使用
发送消息
(WM_SYSCOMMAND对我不起作用)来实现这一点。我实际上试过用C。单击按钮,窗口将通过
ShowWindow()
最小化,然后您可以看到发送的消息:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public class Form1: Form
    {
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool ShowWindow(IntPtr window, int showCommand);

        private const int SW_MINIMIZE = 6;
        private bool print = false;

        public Form1()
        {
            Button button = new Button();
            button.Click += onButtonsClick;
            Controls.Add(button);
        }

        private void onButtonsClick(object sender, EventArgs e)
        {
            print = true;
            ShowWindow(Handle, SW_MINIMIZE);
            print = false;
        }

        protected override void WndProc(ref Message m)
        {
            if (print)
                Console.WriteLine(m.Msg.ToString() + "\t0x" + m.Msg.ToString("x4") + "\t" + m.WParam + "\t" + m.LParam);
            base.WndProc(ref m);
        }
    }
}   

为什么ShowWindow()不可用?如果可以调用SendMessage(),显然可以使用Win32 API构建程序。为什么不调用ShowWindow()?因为正如我所说,热键程序/nircmd/etc.只提供发送/发布消息的接口(就像脚本编写,而不是使用标题等进行编译)。请看,这就是我认为导致它无法“按预期”工作的原因。你提到的这句话正是我昨天在查看
WM\u SHOWWINDOW
页面时所想的。然而,我不明白为什么这个想法会让你觉得奇怪,因为你可以把一个WMU发送到靠近窗户的地方,它就会关闭。您可以发送WM_大小来调整窗口大小。那么,为什么发送一个WM_SHOWWINDOW来取消隐藏一个窗口是不寻常的呢?它会。大多数窗口消息(有些例外)是通知,而不是命令(WM_SIZE是通知;WM_CLOSE是命令)。还要记住,向未知窗口发送任何窗口消息都是有风险的。您无法确定窗口是否会收到消息,也无法确定窗口在收到消息时会做什么。例如,不能保证窗口会响应WM_close而关闭(尽管行为良好的窗口会这样做)。我认为问题在于它不仅仅是一个最小化的窗口,它是隐藏的,所以这不太管用。我确实有一个cmdow(和其他类似的应用程序)的副本。我希望只发送一条消息,但如果这行不通,我可能不得不求助于运行一个外部应用程序。