youzhijiangs 2023-03-26 15:12 采纳率: 33.3%
浏览 34
已结题

线程SendMessageA

DLL 里面想调用主线程CALL
DllMain 里 SetWindowsHookEx 后 SendMessageA 回调会立刻执行,但是在线程内调用 SendMessageA 回调不会有任何反应这是什么原因?我用HPSocket做了一个HTTP的接口 访问会调用SendMessageA 发送消息 然后主线程执行命令,求解感谢

  • 写回答

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条)

报告相同问题?

问题事件

  • 系统已结题 4月3日
  • 已采纳回答 3月26日
  • 创建了问题 3月26日