广播Windows HWND_Broadcast消息
本文关键字:Broadcast 消息 HWND Windows 广播 | 更新日期: 2023-09-27 17:58:15
我正在该应用程序中的应用程序中工作,我将等待应用程序1中的某个事件,当该事件发生时,我将向应用程序2发送消息,应用程序2将执行某些操作。
首次API申报
private const int HWND_BROADCAST = 0xffff;
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern int RegisterWindowMessage(string lpString);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern bool SendNotifyMessage(int hWnd, int Msg, int wParam, int lParam);
应用程序1代码
private string msgstr = "MYMESSAGE";
public int msg = RegisterWindowMessage(msgstr);
if (msg == 0)
{
MessageBox.Show(Marshal.GetLastWin32Error().ToString());
}
//SendNotifyMessage(HWND_BROADCAST, msg, 4848484, 8484865);
SendNotifyMessage(HWND_BROADCAST, msg, 0, 0);
MessageBox.Show(Marshal.GetLastWin32Error().ToString());
应用程序2代码
static readonly int msg = RegisterWindowMessage("MYMESSAGE");
protected override void WndProc(ref Message m)
{
if (m.Msg == msg)
{
MessageBox.Show(m.Msg.ToString() + " = from wndproc");
}
base.WndProc(ref m);
}
有人能指出这个代码的问题吗。我怀疑SendNotifyMessage 有问题
lparam和wparam参数
有人会建议我采取其他方式来实现这种行为吗
-
不存在有问题的代码。只有一些代码没有达到您期望的效果。如果您想让我们告诉您上面的代码有什么问题,您应该告诉我们您期望它做什么,(好吧,我们可以猜测,)但最重要的是,它做了什么。你有错吗?它只是悄无声息地失灵了吗?这是一个问题的重要组成部分,你知道!
-
您正在使用RegisterWindowMessage()和SendNotifyMessage(?
-
应用程序2有一个WndProc,您希望在其中接收窗口的消息。它是否已正确注册?你确定它有效吗?它是否接收其他窗口消息?如果你在应用程序2中发送,它会收到"MYMESSAGE"吗?
-
HWND_BROADCAST仅向顶级窗口发送消息。你确定你的窗口是顶级窗口吗?
-
您没有检查对应用程序2中RegisterWindowMessage()的调用是否成功。首先检查一下怎么样?
-
"MYMESSAGE"不是一个很好的消息名称。不如使用更独特的东西,比如你的名字加姓氏,或者创建一个guid并使用其字符串表示形式作为消息的名称?
HWND_BROADCAST
非常危险。。我知道这是极不可能的,但如果另一个应用程序也处理了你的消息呢??
不管怎样,除此之外,你读过吗http://msdn.microsoft.com/en-us/library/ms644953.aspx
调试代码问题的最基本方法(因为它是基于WINAPI的)是使用GetLastError
。您应该始终检查方法的返回值,看看它们是否成功,所以确保它返回零(这意味着它有效)。如果不是,并且出现了访问被拒绝等错误,请尝试在禁用UAC或以管理员身份(Vista+)运行。
当消息被UIPI阻止时最后一个错误,检索时使用GetLastError设置为5(访问拒绝)。
下面的代码运行得很好,
服务器端
public partial class Server : Form
{
private UInt32 msg;
public Server()
{
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
msg = RegisterWindowMessage("THIS_IS_MY_UNIQUE_MESSAGE");
}
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern uint RegisterWindowMessage(string lpString);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern bool SendNotifyMessage(IntPtr hWnd, uint msg, int wParam, int lParam);
private void SendMessage(object sender, EventArgs e)
{
var retval = SendNotifyMessage(new IntPtr(-1), msg, 0, 0);
}
}
客户端
public partial class Client : Form
{
public Client()
{
InitializeComponent();
}
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern uint RegisterWindowMessage(string lpString);
private static UInt32 GetMessage()
{
return RegisterWindowMessage("THIS_IS_MY_UNIQUE_MESSAGE");
}
protected override void WndProc(ref Message m)
{
if (m.Msg == (int)GetMessage())
{
MessageBox.Show(@"Hello, from server");
}
base.WndProc(ref m);
}
}