【问题标题】:Using WM_SHOWWINDOW to Show a Window instead of ShowWindow()使用 WM_SHOWWINDOW 显示窗口而不是 ShowWindow()
【发布时间】:2011-04-07 14:01:45
【问题描述】:

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

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

但是我没有可用的 ShowWindow();我只能发送 Windows 消息。但是 ShowWindow() 并不神奇,它肯定可以通过 SendMessage 对 WM_SHOWWINDOW 或其他东西起作用。

如何通过发送消息让窗口显示自己?

谢谢。

【问题讨论】:

  • 为什么 ShowWindow() 不可用?如果您可以调用 SendMessage(),您显然可以使用 Win32 API 构建程序。为什么不调用 ShowWindow()?
  • 因为就像我说的,热键程序/nircmd/etc。只提供一个发送/发布消息的接口(它就像脚本,而不是带有标题等的编译)。

标签: windows winapi sendmessage windows-messages


【解决方案1】:

试试这两条消息:

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

或者如果使用 3rd 方应用没问题,试试cmdow

【讨论】:

  • 发生了一些事情(窗口闪烁然后消失)。我认为问题在于它不仅仅是一个最小化的窗口,它是隐藏的,所以这不太有效。我实际上确实有一份 cmdow (和其他类似的应用程序)。我希望只发送一条消息,但如果这不起作用,我可能不得不求助于运行外部应用程序。
【解决方案2】:

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

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

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

【讨论】:

  • 看,这就是我认为导致它无法“按预期”工作的原因。你提到的这句话正是我昨天查看WM_SHOWWINDOW 页面时所想的。但是我不明白为什么这个想法对您来说似乎很奇怪,因为您可以将 WM_CLOSE 发送到窗口并且它将关闭。您可以发送 WM_SIZE 来调整窗口大小。那么为什么要发送一个 WM_SHOWWINDOW 来取消隐藏窗口呢?
  • 会的。大多数窗口消息(有一些例外)是通知,而不是命令(WM_SIZE 是通知;WM_CLOSE 是命令)。还要记住,向未知窗口发送 any 窗口消息是有风险的。你无法确定窗口是否会收到消息,当然也无法确定窗口收到消息后会做什么。例如,不能保证窗口会在响应 WM_CLOSE 时关闭(尽管表现良好的窗口会这样做)。
【解决方案3】:

我认为没有办法使用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);
        }
    }
}   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多