我正在尝试使用热键实用程序(或NirCMD等)的SendMessage函数来弹出一个隐藏的窗口。我可以通过发送0x0010(WM_CLOSE)来关闭窗口,但是当我尝试发送0x0018(WM_SHOWWINDOW),其中wParam为1且lParam为0时,没有任何反应。
我环顾四周,有人抱怨WM_SHOWWINDOW不起作用的地方,他们很乐意接受使用ShowWindow()的建议。
但是我没有ShowWindow();我只能发送Windows消息。但ShowWindow()并不神奇,当然它可以通过SendMessage-WM_SHOWWINDOW或其他方式工作。
如何通过向其发送消息来显示自己的窗口?
感谢。
答案 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);
}
}
}