c#托盘程序如何接收另外一个进程发来的消息
时间: 2023-11-27 07:05:22 浏览: 45
要让托盘程序接收来自另一个进程的消息,可以使用Windows API中的“Windows消息”机制。以下是一些基本的步骤:
1. 在托盘程序中创建一个消息处理函数。例如:
```csharp
protected override void WndProc(ref Message m)
{
const int WM_USER = 0x0400;
const int MY_MESSAGE_ID = WM_USER + 1;
if (m.Msg == MY_MESSAGE_ID)
{
// 处理来自另一个进程的消息
// ...
}
base.WndProc(ref m);
}
```
此代码将定义一个名为“WndProc”的函数,它将接收Windows消息,并检查消息是否与自定义的消息ID匹配(在此示例中为“MY_MESSAGE_ID”)。如果是,则可以在此函数中处理来自另一个进程的消息。
2. 在托盘程序中创建一个唯一的窗口句柄,并将其注册到Windows消息系统中。例如:
```csharp
[DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);
[DllImport("user32.dll")]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
private const int MY_MESSAGE_ID = 0x0400 + 1;
private const int WM_USER = 0x0400;
private IntPtr _hWnd;
private void RegisterWindow()
{
// 创建一个唯一的窗口句柄
_hWnd = Handle;
// 将窗口句柄注册到Windows消息系统中
RegisterHotKey(_hWnd, MY_MESSAGE_ID, 0, 0);
}
private void UnregisterWindow()
{
// 将窗口句柄从Windows消息系统中注销
UnregisterHotKey(_hWnd, MY_MESSAGE_ID);
}
```
此代码将创建一个名为“RegisterWindow”的函数,该函数将创建一个唯一的窗口句柄,并将其注册到Windows消息系统中。如果需要停止接收消息,则可以使用名为“UnregisterWindow”的函数将窗口句柄从Windows消息系统中注销。
3. 在另一个进程中发送消息到托盘程序。例如:
```csharp
[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
private const int MY_MESSAGE_ID = 0x0400 + 1;
private void SendMyMessage()
{
// 获取托盘程序的窗口句柄
var hWnd = FindWindow(null, "托盘程序的标题");
// 发送消息
SendMessage(hWnd, MY_MESSAGE_ID, IntPtr.Zero, IntPtr.Zero);
}
```
此代码将使用名为“SendMessage”的函数向另一个进程发送消息。在此示例中,需要使用托盘程序的窗口句柄(可以通过窗口标题查找)以及自定义的消息ID(在此示例中为“MY_MESSAGE_ID”)。
以上就是托盘程序接收来自另一个进程的消息的基本步骤。请注意,此示例代码仅用于演示目的,实际应用中可能需要进行更多的错误处理和安全检查。