c - win32api函数的顺序导致回调函数接收相同的消息

标签 c winapi callback messagebox sendmessage

我有一个资源文件 (.rc),其中包含以下内容

#include <windows.h>
#include "resource.h"

IDD_ABOUT DIALOG DISCARDABLE  0, 0, 500, 106
BEGIN

    DEFPUSHBUTTON   "&OK", IDOK,            174, 18, 50, 14

    RADIOBUTTON     "Radio 1", ID_RADIOBUTTON1, 226, 18, 55, 14
END

我的 C 文件包含以下内容

#include <windows.h>
#include "resource.h"

BOOL CALLBACK AboutDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
    switch(Message)
    {
        case WM_COMMAND:
        switch(LOWORD(wParam))
        {
            case ID_RADIOBUTTON1:
            {
                MessageBox(hwnd, "RadioButton 1", "111", MB_OK);
                SendMessage((HWND)lParam, (UINT) BM_SETCHECK, (WPARAM) BST_CHECKED,(LPARAM)NULL);
            }
        return TRUE;
        break;

        }
    break;
        default:
            return FALSE;
    }
        return TRUE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_ABOUT), NULL, AboutDlgProc);
}

在对话框打开后单击单选按钮一次,回调函数会重复接收相同的消息,该消息是一 strip 有 LOWORD(wParam) == ID_RADIOBUTTON1 的 WM_COMMAND。但如果在 MessageBox 之前调用 SendMessage,则不会发生错误。这有什么具体原因吗?

编辑

<小时/>

但是,如果我用 printf 替换对 MessageBox 的调用,则不会发生错误,并且行为符合预期,并且仅生成单个输出实例。

我使用 gcc 和 Windres 来制作程序。

我的操作系统是 Windows Vista(tm) Home Premium 32 位 Service Pack 2

最佳答案

使用AUTORADIOBUTTON(而不是RADIOBUTTON)这将自动设置选择标记。例如:

IDD_ABOUT DIALOGEX 0, 0, 222, 257
STYLE DS_ABSALIGN | DS_SETFONT | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 9, "Segoe UI", 400, 0, 0x0
BEGIN
    DEFPUSHBUTTON   "&OK", IDOK,  174, 18, 50, 14
    AUTORADIOBUTTON "Radio 1", ID_RADIOBUTTON1, 226, 18, 55, 14
END

您可以使用MessageBox或其他模态窗口:

...
case ID_RADIOBUTTON1:
{
    MessageBox...
}

对于RADIOBUTTON,您必须自己设置选择标记。尽快执行此操作并立即返回 TRUE。不要在以下位置之前或之后调用 MessageBox:

case ID_RADIOBUTTON1:
    SendMessage((HWND)lParam, BM_SETCHECK, !IsDlgButtonChecked(hwnd, ID_RADIOBUTTON1), 0);
    return TRUE;

关于c - win32api函数的顺序导致回调函数接收相同的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36252504/

相关文章:

c# - SB_GETTEXT 不填充字符串生成器

javascript - 将数据注入(inject)异步回调(使用 node.js)

c++ - 如何避免复制回调函数 (C++)

c - 打开文件以从 Solaris 中用 C 编写的共享库进行写入

c - 当用户输入 "quit"时使 while 循环不打印(在用户说退出但程序结束后仍打印 STR)

winapi - 如何从 Google Chrome 扩展程序向桌面应用程序发送消息?

c - 如何在编辑控件中垂直居中文本?

在函数上下文中使用 this 关键字的 JavaScript 回调

c - 需要清楚地了解 timespec 结构

c - getlogin() c 函数返回 NULL 和错误 "No such file or directory"