3

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

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

但是我没有可用的 ShowWindow();我只能发送 Windows 消息。但是 ShowWindow() 并不神奇,它肯定可以通过 SendMessage-ing 一个 WM_SHOWWINDOW 或在幕后的东西来工作。

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

谢谢。

4

3 回答 3

4

试试这两条消息:

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

或者如果可以使用 3rd 方应用程序,请尝试cmdow

于 2010-09-03T00:47:52.357 回答
2

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

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

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

于 2010-09-02T21:42:54.147 回答
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);
        }
    }
}   
于 2014-05-20T10:10:03.900 回答