有 2 个具有几乎相同代码的独立应用程序。在其中一个中,我们生成一条消息(通过单击鼠标),并与该消息一起发送指向该结构的指针。
问题:如何从一个应用程序发送消息,并在没有蓝屏的情况下拦截另一个应用程序。
已经尝试过的:
//Высылаемая структура, есть глобальный объект структуры - ball
struct ballXY
{
bool state;
int azaz;
};
ballXY ball = {false, 666};
// а так же message для нашей структуры
const UINT ball_msg = RegisterWindowMessage((LPCWSTR)("ball"));
该函数CALLBACK看起来像这样:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == ball_msg)
{
ball = *(ballXY*)lParam;
return 0;
}
switch (message)
{
case WM_PAINT:
//рисуем тут
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN:
if (!ball.state)
ball.state = true;
break;
case WM_TIMER:
if (ball.state) {
SendMessage(HWND_BROADCAST, ball_msg, NULL, (LPARAM)&ball);
ball.state = false;
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
return 0;
}
底线:启动了 2 个应用程序后,我将鼠标右键合为一个 - 资源管理器被涂掉了,一些程序被关闭了。
对于处理器间数据传输,Windows API 提供了两种简单的方法:
命名管道。尽管我在对问题的评论中建议了这种方法,但它充满了一个致命的困难。如果传输应用程序崩溃,谁将关闭通道?既然频道是共享的,那么就没有人- 会有全球资源的泄漏。
发送窗口消息
WM_COPYDATA。此消息是少数几个由具有特殊权限的窗口子系统处理的消息之一,因此其中指定的字节块将被小心地复制到接收者的地址空间中。使用这种方法,代码将如下所示:
发送消息:
窗口程序: