使用WM_SHOWWINDOW显示窗口而不是ShowWindow()

时间:2010-09-02 21:33:17

标签: windows winapi sendmessage windows-messages

我正在尝试使用热键实用程序(或NirCMD等)的SendMessage函数来弹出一个隐藏的窗口。我可以通过发送0x0010(WM_CLOSE)来关闭窗口,但是当我尝试发送0x0018(WM_SHOWWINDOW),其中wParam为1且lParam为0时,没有任何反应。

我环顾四周,有人抱怨WM_SHOWWINDOW不起作用的地方,他们很乐意接受使用ShowWindow()的建议。

但是我没有ShowWindow();我只能发送Windows消息。但ShowWindow()并不神奇,当然它可以通过SendMessage-WM_SHOWWINDOW或其他方式工作。

如何通过向其发送消息来显示自己的窗口?

感谢。

3 个答案:

答案 0 :(得分:3)

尝试以下两条消息:

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

如果使用第三方应用即可,请尝试cmdow

答案 1 :(得分:2)

WM_SHOWWINDOW是通知,而不是命令。来自MSDN:

  

当窗口即将被隐藏或显示时,WM_SHOWWINDOW消息将被发送到窗口。

我不相信您可以使用任何消息来显示窗口。实际上,这个想法对我来说似乎有点奇怪。窗口管理器是负责显示和隐藏窗口的系统组件。要显示窗口,您必须使用其中一个窗口管理器API。

答案 2 :(得分:0)

我认为没有办法SendMessage实现这一点(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);
        }
    }
}