在非模式对话框中阻止 ESC 和 Enter 键(Win32、非 MFC)

2024-01-19

有一些关于这个主题的文章,但没有一篇适合我的情况。我正在使用 Win32(无 MFC)编写以下内容。目标是防止ESC or ENTER键关闭非模式对话框。

这是对话框模板:

IDD_DIALOG_1 DIALOGEX 0, 0, 345, 179
STYLE DS_SETFONT | DS_FIXEDSYS | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION ""
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    CONTROL         "New Pt",IDC_CHECK_NEW_PT,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,7,3,39,12
    CONTROL         "Lines",IDC_CHECK_LINES,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,54,3,39,12
    CONTROL         "Curves",IDC_CHECK_CURVES,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,94,3,39,12
    CONTROL         "Ellipses",IDC_CHECK_ELLIPSE,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,134,3,39,12
    CONTROL         "Circles",IDC_CHECK_CIRCLE,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,174,3,39,12
    LTEXT           "Pen Size:",IDC_STATIC,242,7,30,8
    EDITTEXT        IDC_EDIT_PEN_SIZE,275,3,40,14,ES_CENTER | ES_AUTOHSCROLL | ES_NUMBER
    CONTROL         "",IDC_SPIN_PEN_SIZE,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,316,3,11,14
    EDITTEXT        IDC_EDIT_SRC,7,19,331,106,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL | WS_HSCROLL
END

为了捕获这两个键,我将消息循环更改为:

MSG msg;

// Main message loop:
for(int nR;;)
{
    nR = ::GetMessage(&msg, nullptr, 0, 0);
    if(!nR)
    {
        break;
    }
    else if(nR == -1)
    {
        //Error
        ASSERT(NULL);
        break;
    }

    if(ghActiveModelessDlg)
    {
        BOOL bProcessAsDlgMsg = TRUE;

        if(msg.message == WM_KEYDOWN ||
            msg.message == WM_KEYUP)
        {
            //Try to trap ESC & Enter keys
            if(msg.wParam == VK_ESCAPE)
            {
                //Do not process
                bProcessAsDlgMsg = FALSE;
            }
            else if(msg.wParam == VK_RETURN)
                goto lbl_check_enter;
        }
        else if(msg.message == WM_CHAR)
        {
            //Try to trap ESC & Enter key
            if(msg.wParam == 27)
            {
                //ESC - Do not process
                bProcessAsDlgMsg = FALSE;
            }
            else if(msg.wParam == '\r')
            {
lbl_check_enter:
                //See what window is it
                WCHAR buffClass[256];
                if(::GetClassName(msg.hwnd, buffClass, _countof(buffClass)) &&
                    lstrcmpi(buffClass, L"edit") == 0 &&
                    (::GetWindowLongPtr(msg.hwnd, GWL_STYLE) & ES_WANTRETURN))
                {
                    //This is edit ctrl that can handle its own Enter keystroke
                }
                else
                {
                    //Do not process
                    bProcessAsDlgMsg = FALSE;
                }
            }
        }

        if(bProcessAsDlgMsg)
        {
            if(::IsDialogMessage(ghActiveModelessDlg, &msg))
            {
                continue;
            }
        }
    }

    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

And ghActiveModelessDlg从内部设置DlgProc对于这样的无模式对话框:

INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(hDlg)
    {
        //...

        case WM_ACTIVATE:
        {
            //Needed to ensure that keyboard shortcuts are properly processed in the message loop
            ghActiveModelessDlg = wParam != WA_INACTIVE ? hDlg : NULL;
        }
        break;
    }

    return 0;
}

这在大多数情况下都有效。除了这个。

这是顺序。将焦点置于多行编辑框中,然后按任意字母/数字键,然后ESC:

然后它将关闭对话框。

知道它如何通过我上面的覆盖代码吗?

附言。有趣的观察。

1)如果我刚刚击中ESC首先,我的代码捕获了它。只有当我按下其他键然后ESC它失败。

2)如果我注释掉调用的行IsDialogMessage(以及随后的continue)它停止接受ESC。所以我的猜测是,这不是编辑控件执行的。


如果我们只想通过单击关闭来关闭对话框X系统菜单中的按钮(或通过ALT+F4)并禁用附近ESC and ENTER钥匙 - 我们需要的一切 - 打电话DestroyWindow当过程(WM_SYSCOMMAND, SC_CLOSE)并且什么都不做(WM_COMMAND, IDCANCEL, IDOK)。我们不需要特殊的消息循环或子类任何控件。并且对话框中没有带有 IDOK/IDCANCEL id 的按钮

INT_PTR DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{

    switch (uMsg)
    {
    case WM_SYSCOMMAND:
        if ((wParam & 0xfff0) == SC_CLOSE) DestroyWindow(hwndDlg);
        break;
    case WM_COMMAND:
        switch (wParam)
        {
        case MAKEWPARAM(IDOK, BN_CLICKED):
        case MAKEWPARAM(IDCANCEL, BN_CLICKED):
            // ignore this
            break;
        ....
        }
    }
    ....
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在非模式对话框中阻止 ESC 和 Enter 键(Win32、非 MFC) 的相关文章

  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • 私有模板函数

    我有一堂课 C h class C private template
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable

随机推荐

  • R:枚举矩阵的列组合

    编辑注释 我将标题从 R grep 将字符串矩阵匹配到列表 更改为 R 枚举矩阵的列组合 以更好地反映解决方案 我正在尝试将字符串矩阵与列表进行匹配 以便我最终可以在以后的操作中使用该矩阵作为映射data frame 第一部分按预期工作 返
  • 如何在Go中通过隧道路由http Get?

    我有一个到我的服务器的 ssh 隧道 通过端口 9998 我希望我的 http GET POST 请求通过 Go 中的此端口进行路由 在 java 中 我将指定 DsocksProxyHost 和 DsocksProxyPort 我正在 G
  • 使用 ASP.NET Web API 2.1 配置依赖项注入

    我正在创建一个 ASP NET Web API 2 1 站点 并且由于我想将依赖项直接注入到控制器中 因此我创建了自己的 IDependencyResolver 实现 以便 StructureMap 将为我处理该问题 public clas
  • 使用通配符进行模式匹配

    如何使用通配符识别字符串 我找到了glob2rx 但我不太明白如何使用它 我尝试使用以下代码来选择数据框中以单词开头的行blue make data frame a lt data frame x c red blue1 blue2 red
  • 在逗号分隔的项目进度列表上运行循环 4GL

    def var cList as char no undo assign cList one two three four
  • 多线程代码中是否需要有原子标志?

    我想知道在多线程代码中是否真的有必要使用原子标志 对于这个问题 我重点关注多线程代码中的一个常见情况 通过设置标志来停止线程 我们假设以下伪代码 is running 1 create threads stopper thread runn
  • boost 正则表达式子字符串匹配

    如果模式 regular 是变量 st 的子字符串 我想返回输出 match 这可能吗 int main string st some regular expressions are Regxyzr boost regex ex Rr eg
  • Java 8 流 - 如何将地图中的地图中的所有对象提取到新地图中?

    我有一张地图 siteId gt AppName gt App 我想迭代内部地图中的所有应用程序并创建一个新地图 appId gt App 我在没有流的情况下做到了 Map
  • ASP 会员奇怪问题

    我在 ASP NET 中使用 Membership API 并且在临时服务器上遇到了以下问题 该应用程序在我的本地计算机上运行良好 数据表存储在 SQL Server 上 我的本地服务器和临时服务器都指向同一个数据库服务器 当我部署到临时服
  • 使用 boto3 验证 S3 凭证,无需 GET 或 PUT

    有没有一种方法可以验证给定的一组 S3 凭据是否可以访问特定存储桶 而无需执行某种显式的 PUT 或 GET 实例化 s3 Client s3 Resource 或 s3 Bucket 对象似乎根本不验证凭据 更不用说存储桶访问了 博托3
  • Lua string.gsub() 按 '%s' 或 '\n' 模式

    英语不是我的母语 所以描述这个问题有点困难 我想通过 lua string gsub 在 str 中获取 d 40 但是有一些问题 代码如下 本地字符串 a 10 b 20 c 30 d 40 本地 pat1 s s 本地 pat2 n s
  • 从 html 按钮调用 vbscript 函数

    如果我所做的完全错误或者解决方案是显而易见的 请不要感到惊讶
  • 从 x86 汇编语言调用 C 函数

    是否可以使用 GCC 从 C 函数生成汇编语言函数 以便可以从汇编语言程序中调用它们 我知道 gcc 将 C 编译为机器代码 可以很容易地反汇编为汇编语言 并且我已经知道可以C 中的内联汇编语言函数 https stackoverflow
  • 解析来自 BaseHTTPServer 的 Python HTML POST 数据

    我正在将几个文件从 HTML 表单发送到基于 BaseHTTPServer 的服务器 在我的 do POST 中 我从 rfile read length 获取一个字符串 它看起来像某种多部分 MIME 字符串 谷歌并没有帮助我将其解码为可
  • 用于与父节点通信的react.js自定义事件

    我正在制作并监听普通 DOMCustomEvents 与父节点通信 儿童时期 var moveEvent new CustomEvent the graph group move detail nodes this props nodes
  • Keras inception v3 重新训练和微调错误

    我试图从这里开始这个例子 https keras io applications https keras io applications 工作了几个小时 我有点发疯了 因为它不起作用 如果有人知道我可以尝试什么 我将非常感激 这是我的示例代
  • 尝试使用 ServerManager 获取应用程序池时出现 COMException

    当我尝试使用以下代码从远程服务器获取 IIS 应用程序池列表时 List
  • 我应该在 graphql 模式文件中将每个对象作为“输入”和“类型”写入两次吗

    我必须在 GraphQL 中使用 Java 对象来响应和请求 我是否必须在 GraphQL 架构文件中将每个对象作为 输入 和 类型 写入两次 用于在请求和响应中获取该对象 我应该使用输入和类型定义同一个对象两次吗 file test gr
  • VS2010 - 文件新菜单缺少“新项目”

    一位同事刚刚从 MSDN 安装了 Visual Studio 2010 Premium 安装运行得很好 但是当他单击 文件 菜单时 他只有 新文件 在我的安装中 我看到一个 新建 菜单 其中包含一个子菜单 其中包含项目 文件 团队项目 关于
  • 在非模式对话框中阻止 ESC 和 Enter 键(Win32、非 MFC)

    有一些关于这个主题的文章 但没有一篇适合我的情况 我正在使用 Win32 无 MFC 编写以下内容 目标是防止ESC or ENTER键关闭非模式对话框 这是对话框模板 IDD DIALOG 1 DIALOGEX 0 0 345 179 S