DLL 里面想调用主线程CALL
DllMain 里 SetWindowsHookEx 后 SendMessageA 回调会立刻执行,但是在线程内调用 SendMessageA 回调不会有任何反应这是什么原因?我用HPSocket做了一个HTTP的接口 访问会调用SendMessageA 发送消息 然后主线程执行命令,求解感谢
参考gpt,在 Windows 中,每个线程都有其自己的消息队列,消息必须由该线程的消息循环处理。因此,如果你从一个非主线程调用 SendMessageA 发送消息,则该消息将被发送到该线程的消息队列中,而不是主线程的消息队列中。
如果你想从 DLL 中的线程调用主线程的函数,你可以使用 PostThreadMessage 或 PostMessage 函数将消息发送到主线程的消息队列中,然后在主线程的消息循环中处理该消息。
以下是一个示例代码,演示如何从 DLL 中的线程调用主线程的函数
// 在 DLL 中的线程中调用此函数
void CallMainFunction()
{
// 将消息发送到主线程的消息队列中
PostThreadMessage(GetCurrentThreadId(), WM_USER+1, 0, 0);
}
// 在主线程中处理消息的函数
LRESULT CALLBACK MainThreadProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == WM_USER+1)
{
// 在此处调用主线程的函数
// ...
return 0;
}
// 如果没有处理该消息,返回默认的处理结果
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
// 在主线程中初始化
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// 注册窗口类
WNDCLASS wc = {0};
wc.lpfnWndProc = MainThreadProc;
wc.hInstance = hInstance;
wc.lpszClassName = "MainWndClass";
RegisterClass(&wc);
// 创建窗口
HWND hwnd = CreateWindow("MainWndClass", NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, hInstance, NULL);
// 启动消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
在上述示例中,CallMainFunction 函数是在 DLL 中的线程中调用的。它使用 PostThreadMessage 函数将一个自定义消息发送到主线程的消息队列中。主线程的消息循环处理该消息,并在 MainThreadProc 函数中调用相应的函数。
请注意,在使用 PostThreadMessage 或 PostMessage 函数时,你需要确保你发送的消息参数是正确的,并且你的主线程具有一个消息循环以便处理这些消息。
参考GPT和自己的思路:根据你提供的信息,可能是因为在线程内调用 SendMessageA 函数时,消息被发送到了该线程的消息队列,而不是主线程的消息队列。因此,主线程无法接收到该消息并执行命令。
为了让主线程能够接收到线程发送的消息,您可以使用 PostMessage 函数将消息发送到主线程的消息队列,而不是 SendMessageA 函数。这样主线程将能够通过消息循环接收并处理该消息。
此外,您还可以尝试使用其他线程间通信(IPC)机制,例如:共享内存、管道、套接字等。这些机制可以让不同线程之间进行通信,并能够在不同进程之间也能传递消息。
希望这些信息对您有帮助。如果您有任何问题,请随时向我提出。