【问题标题】:Can I call TranslateMessage inside the message callback?我可以在消息回调中调用 TranslateMessage 吗?
【发布时间】:2013-03-19 10:15:00
【问题描述】:

我没有运行规范的消息循环,那么有没有办法可以在我的消息 proc 处理程序中调用 TranslateMessage(或其等效项)?

基本上我需要WM_CHAR 消息,除非我可以调用 TranslateMessage,否则我不会收到这些消息。目前我有消息处理设置,但没有消息循环。

// Static window function called by Windows for message processing. Implementation 
// delegates message processing to MemberWndProc.
LRESULT CALLBACK FxPlayerTiny::WindowsMsgStatic(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{

      msg = PeekMessage(&msg, HWnd, WM_KEYFIRST, WM_KEYLAST, PM_NOREMOVE);

      if (msg type is key down){

            TranslateMessage(&msg);
            //DispatchMessage(&msg); -- needed?

      }
      else process msg normally
}

我的消息 proc 处理程序是消息的第一个入口点,按以下方式设置:

WNDCLASSEX  wc;
wc.lpfnWndProc    = WindowsMsgStatic;
....
RegisterClassEx(&wc);

【问题讨论】:

    标签: winapi visual-c++ message-queue


    【解决方案1】:

    在某些时候,为了获得排队的消息,您必须调用像 GetMessagePeekMessage 这样的函数。这些函数产生MSG 对象,而您必须将这些MSG 对象传递给TranslateMessageDispatchMessage

    在问题原始版本的代码中,您尝试调用 TranslateMessageDispatchMessage 为时已晚。你在你的窗口过程中调用它们。您应该在第一次收到MSG 对象时调用它们。换句话说,在调用PeekMessageGetMessage 之后直接调用TranslateMessageDispatchMessage

    【讨论】:

    • 您的代码编辑使我的回答现在看起来很愚蠢。我真的不想一遍又一遍地重写它。关于WM_CHAR,由TranslateMessage发布到窗口。你的问题的问题是你只提出了一个关于问题的小窗口。所以我们可以解决那个小窗口,但是你会发现根本问题还没有完全解决。然后你把窗户打开得更大,改变我们的看法。你应该告诉我们一切!
    • 这就是我的全部!我没有要显示的消息循环处理代码了!
    • 但是我们看不到大图。我可以说你在窗口进程中抽队列是不对的。
    • 必须在某个地方调用PeekMessageGetMessage,否则您的窗口将永远不会收到任何消息,并且您的程序似乎会被锁定。无论您在哪里调用这些函数,都必须在哪里调用 TranslateMessage
    • 在这个问题的当前版本的代码中,我可以看到你在窗口 proc 中抽队列。我不明白为什么你不能使用阻塞消息队列。 99.999% 的应用程序成功地做到了这一点。是什么阻止了你?
    猜你喜欢
    • 2016-05-19
    • 2011-04-27
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    相关资源
    最近更新 更多