首页 > 解决方案 > 查找“33614080”的 mfc 大型机 OnCommand 消息

问题描述

编辑3:这不好-每次窗口失去焦点时都会发送向右箭头键-不良行为。

我尝试在用户单击关闭框时进行拦截,但到目前为止我还没有在类向导中找到它。如果有人知道如何检测此事件,请告诉我。

原始帖子:

编辑 2:我已经编辑了不使用幻数的解决方案的代码,但正如 Mark Ransom 所指出的,这不是为输入提示选择特定按钮的正确方法,因此这可能正常工作,但它是一个黑客。

我在 MFC 中有一个旧版应用程序,在退出以保存更改时会有提示。当输入提示打开时,当提示用户在 CMainFrame 窗口中保存更改时,应选择“否”按钮。这样用户就可以按 Enter 键退出,而无需使用鼠标来选择它。是的,我知道用户可以简单地按“N”键来激活“否”按钮,但需要选择“否”按钮,以便用户可以按 Enter 键退出。

使用消息循环:

BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam) 

在提示保存更改之前,我可以在窗口关闭时检测到一条消息。

所以我添加了这个数值,并发送右箭头键在输入消息提示中选择“否”。

编辑:添加 switch 语句的开头以显示正在评估的内容。

// this is part of 'BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)' 
BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam) 
{
switch( wParam )
{
...
//case 33614080:
    //SendRightArrowKey();
    //break;
default:
    WORD loWord = LOWORD(wParam);
    if (ID_RECORD_FIRST == loWord)
    {
        WORD HiWord = HIWORD(wParam);
        unsigned short value = HiWord;
        char buff[32];
        _itoa(value, buff, 10);
        if (EN_KILLFOCUS == value )
        {
            SendRightArrowKey();
        }           
        return TRUE;
    }
}

return CFrameWnd::OnCommand(wParam, lParam);
}


void SendRightArrowKey()
{
    INPUT output[2];
    ZeroMemory(&output, sizeof(output));
    // Right arrow key down
    output[0].type = INPUT_KEYBOARD;
    output[0].ki.wVk = VK_RIGHT;
    output[0].ki.time = 0;
    output[0].ki.dwExtraInfo = 0;

    // Right arrow key up
    output[1].type = INPUT_KEYBOARD;
    output[1].ki.wVk = VK_RIGHT;
    output[1].ki.dwFlags = KEYEVENTF_KEYUP;
    output[1].ki.time = 0;
    output[1].ki.dwExtraInfo = 0;

    int retval1 = SendInput(2, output, sizeof(INPUT));
}

这适用于 win32 和 x64,但感觉就像一个 hack——尤其是因为我找不到数字代码 33614080 的任何定义。应该有一个常量或宏用于为 WParam 发送的 windows 消息,以防万一Microsoft 曾经更改此值。

有谁知道这个 WParam 值可能代表的常量,或者默认选择“否”按钮的另一种方式?

提前感谢您的任何回复。

感谢 Adrian 弄清楚这些值。

标签: c++windowsmfc

解决方案


推荐阅读