DLL 里面想调用主线程CALL
DllMain 里 SetWindowsHookEx 后 SendMessageA 回调会立刻执行,但是在线程内调用 SendMessageA 回调不会有任何反应这是什么原因?我用HPSocket做了一个HTTP的接口 访问会调用SendMessageA 发送消息 然后主线程执行命令,求解感谢
线程SendMessageA
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- 「已注销」 2023-03-26 15:27关注
参考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 函数时,你需要确保你发送的消息参数是正确的,并且你的主线程具有一个消息循环以便处理这些消息。
本回答被题主选为最佳回答 , 对您是否有帮助呢?评论 打赏 举报解决 2无用