C# 广播Windows HWNDU广播消息
我正在该应用程序中的某个应用程序中工作,我将等待应用程序1中的某个事件,当该事件发生时,我将向应用程序2发送消息,应用程序2将执行某些操作 第一次API声明C# 广播Windows HWNDU广播消息,c#,winapi,ipc,C#,Winapi,Ipc,我正在该应用程序中的某个应用程序中工作,我将等待应用程序1中的某个事件,当该事件发生时,我将向应用程序2发送消息,应用程序2将执行某些操作 第一次API声明 private const int HWND_BROADCAST = 0xffff; [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern int RegisterWindowMessage(
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
参数
有人能给我推荐其他方法来实现这种行为吗
HWND\u广播
非常危险。。我知道这不太可能,但如果另一个应用程序也处理了您的消息呢
不管怎么说,你有没有读过
调试代码问题的最基本方法(因为它基于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);
}
}
UIPI和UAC是什么意思?用户界面特权隔离(UIPI)、用户帐户控制(UAC)。UAC是您应该担心的问题,因为默认情况下,应用程序在Vista+上“无特权”运行,我相信您知道,您是否尝试过运行应用程序作为管理员?是的,我正在以管理员身份运行我的应用程序。我收到上一个错误0。在没有管理员权限的情况下,它返回5。您是对的。但我仍然没有在应用程序2上收到。您是否尝试将通过WndProc发送的所有邮件记录到文件中?这将是很多(通常),但您可以通过它搜索应用程序1返回的消息ID。你确定他们都是同一个身份证吗?如果你独立运行这些应用程序,它们可能是相同的,但一起运行可能会中断..谢谢你的帮助问题在于访问权限。谢谢!你能给我推荐其他的方法来达到这种行为(学习目的)吗。将字符串作为参数传递如何?