用广播系统消息杀死旧进程

Killing old process with BroadcastSystemMessage

本文关键字:进程 广播 系统消息      更新时间:2023-10-16

我有一个应用程序(本机C++,Windows),不能在一台机器上同时运行。我想要实现的行为是这样的:在尝试运行应用程序的第二个实例时,第一个实例停止运行。

为此,我想使用 WinApi 函数 BroadcastSystemMessage() 类似于下面的示例。

当应用程序启动时,它会发送:

BroadcastSystemMessage(BSF_POSTMESSAGE, &dwRecepients, 0x666, 0, 0);

但是,当我在调试模式下运行我的应用程序时,它不会命中

case 0x666:
    int iClose = 0 + 1;
break;

当我启动另一个实例时。其他消息已正确连接(WM_KEYDOWN、WM_ACTIVATE 和其他消息)。

我做错了什么?

为了广播自定义消息,您需要使用 RegisterWindowMessage 函数为其创建一个 id,例如:

UINT msg666 = RegisterWindowMessage(L"custom_devil_message");

并在发送和接收代码中使用它:

// sending code
BroadcastSystemMessage(BSF_POSTMESSAGE, &dwRecepients, msg666, 0, 0);
// receiving code
case msg666:
    int iClose = 0 + 1;
break;

请记住,消息不适用于控制台应用程序。

将消息类型更改为 WM_APPCOMMAND + 10 后,解决方案开始起作用。无论如何,它没有帮助,因为 BroadcastSystemMessage() 不会将消息广播到浏览器中的选项卡,这是我的情况。另外,我找不到允许使用BroadcastSystemMessage()发送的消息类型范围。