问题标签 [message-loop]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
618 浏览

c++ - 为什么 win32 消息循环在线程化时停止工作?

我正在尝试创建一个 WIN32 (C++) 程序,在该程序中我必须同时处理消息并运行一个 while 循环。为了做到这一点,我想使用线程。

当我将消息循环移动到一个单独的过程(从函数 WinMain 调用)时,一切正常。但是,当我使用下面的代码线程化该过程时,而不是简单地从主进程调用它,窗口变得无响应。

你知道为什么会这样吗?

在 WinMain 中,创建主窗口后,我删除了消息循环和返回值,添加了以下代码:

return_val是一个全局变量,我将使用它来接收消息循环结束时 WinMain 应该返回的值。

此外,函数 message_loop 如下:

0 投票
1 回答
288 浏览

c++ - 如何退出/中断控制台应用程序中的 Windows 消息循环和 Windows 桌面应用程序的尊重?

我想打破 Windows 消息循环。就像C++ 如何在 windows hook 中打破消息循环一样。我想出了一种解决方案,它适用于 Window 桌面应用程序,但不适用于控制台应用程序。这怎么会发生?

编辑:我将我的代码上传到https://github.com/hellohawaii3/Experiment,克隆它,然后你可以快速重现我的问题。谢谢!

1.我为什么要这样做?

我正在编写一个控制台应用程序。首先,要求用户设置一些决定应用程序行为的选项。然后,应用程序启动消息循环并监视键盘/鼠标的输入。用户可能想要更改设置,所以我想让用户按下某个热键,退出消息循环并返回到应用程序的开头。

如果您知道任何方法来实现此功能而不必担心会中断消息循环,请告诉我!但是,我也想知道为什么我的解决方案对于控制台应用程序失败并且适用于桌面应用程序。谢谢你的帮助!

2.我试过什么。

我使用一个布尔变量' recieve_quit '。当按下键盘上的某个键时,挂钩回调函数将变量设置为 True。对于每个循环获取消息,首先检查变量' recieve_quit '并在变量为 False 时退出。

3.我的实验结果

对于控制台 APP,当按下某个键时,变量“ recieve_quit ”设置正确,但是,消息循环继续。

对于带有 GUI 的 Windows 桌面应用程序,我可以按预期退出消息循环。

4.实验设置

我正在使用 VS2019、C++、Windows 10 家庭 1909。

我使用 dll injection 为我的控制台应用程序设置挂钩。

5.我的代码

我在这里提供玩具示例代码,其中大部分是由 Visual Studio 自动生成的,如果您认为我的代码过于冗长,请不要打扰

(a)我的控制台应用程序

安慰:

(b)我的 dll 包含钩子函数

我的 dll_func.h 文件,遵循文档https://docs.microsoft.com/en-us/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=msvc-160

我的 dll_func.cpp 文件,包含挂钩函数的定义。

dllmain.cpp 在由 Visual Studio 创建后也根据https://stackoverflow.com/a/60913531/9758790的建议进行了一些修改,以获得用于 dll 注入的 dll 的实例。

(c) 我的桌面应用程序。

使用 Visual Studio 创建解决方案时,我选择“创建 Windows 桌面应用程序”。大多数代码是由 VS 自动生成的。我添加和修改的代码在代码中被 ***** 包围。

(d) 重现我的结果的提示

对于 Console APP:新建一个名为Console的控制台应用解决方案,并复制我的代码替换 Console.cpp。向此解决方案添加一个新项目,选择Create new project -> DLL,将其命名为Dll1。创建 dll_func.h、dll_func.c,并将我的代码复制进去。不要忘记修改 dllmain.cpp。设置 AdditionalIncludeDirectories 的路径,将 dll1.lib 添加到 AdditionalDependencies。也设置 dll 和 lib 文件的路径。

对于 Windows 桌面应用程序:构建一个现在的 Windows 桌面应用程序解决方案,将其命名为 GUI。在 GUI.cpp 中复制我的代码并简单地运行它。按 F8 键,应用程序将退出并按预期弹出一个消息框。

0 投票
2 回答
72 浏览

winapi - 如何在 ATL exe 中为多个对话框发送消息

Microsoft 有一篇知识库文章描述了如何修改 ATL .exe 中的消息循环,以便无模式对话框可以接收适当的消息。

如果您可能有多个无模式对话框,并且您不知道在任何给定时间可能存在哪些对话框,我想知道如何优雅地做到这一点。就像 .exe 可能托管几个不同的 COM 类一样,每个类都有不同的对话框,谁知道可能会实例化哪一个。

您是否会创建一个全局 hwnd 集,并让每个对话框类在创建时将其 hwnd 放在集合中,然后让消息循环遍历集合调用IsDialogMessage(and TranslateAccelerator)?

0 投票
1 回答
75 浏览

c++ - 为什么 DestroyWindow 被阻止?

我在子线程中创建了一个窗口和消息循环。当我通过 发送自定义消息时PostMessage,当我DestroyWindow在线程中调用时,DestroyWindow阻塞并没有触发 WM_DESTORY,因此消息循环线程无法正常退出。我试过PostThreadMessage了,另外我试过用closewindow。但问题是WM_DESTORY调用后没有触发DestroyWindow,不是PostMessage. 消息循环线程仍在运行且窗口句柄有效,为什么?折腾了几天,找不到原因,非常感谢。

销毁窗口:

创建窗口:

消息循环线程:

//这里阻塞了

0 投票
1 回答
62 浏览

c# - Application.Run() 之后如何调用消息循环

Application.Run()在没有对话框的情况下调用后,如何调用胎面/表单的消息循环?原因是我想准备(并稍后显示)一个可单击的对话框,即使在主应用程序中显示了模态对话框。

0 投票
1 回答
62 浏览

c++ - 当用户键入字母时,MFC CListView 如何防止搜索和自动选择?

TL;博士

在 C++ MFC CListView 中,当 CListView 具有键盘焦点时,如何防止基于用户键入的字母进行自动选择?

情况:

MFC 应用程序使用 CListView 来显示包含字母数字字符串的行集合。如果我选择列表使其具有键盘焦点然后键入一个字母,则列表选择会跳转到第一列值以该字母开头的第一项。

即:如果我键入“r”,则列表列表选择会跳转到以字母“r”开头的第一个项目。如果我然后键入“b”,则列表选择会跳转到以字母 b 开头的第一个项目。等等。

当我使用 VS2019 新项目向导创建新应用程序时,此行为在 CListView 中是自动的。

问题一:

如何防止这种自动选择发生,同时不干扰向上/向下箭头键导航?

在对此进行打击的过程中,我发现带有 WC_LISTVIEW 类的直接 WIN32 窗口的行为也是如此,所以我认为必须有一种样式可以打开或关闭它?

如果它是一种样式,那么我可以在 OnInitialUpdate() 的 ModifyStyle() 调用中更改它,或者甚至只是使用它的 HWND 向控件发送消息?

所以......问题2:

我可以关闭它而不进入 CListView 的消息处理循环中的杂草吗?

评论

我不是在寻找 CListView 可以执行的高级多字母子字符串匹配搜索

我希望 CListView 在我键入字母或数字时停止更改选择,并且我希望它继续更改选择以响应向上/向下箭头、向上翻页/向下翻页和主页/结束键的正常行为. 因此,如果您愿意,请关闭搜索。

代码

我可以发布更多代码,但这将是 VS2019 New Project -> C++ -> MFC-> Explorer Style 向导的输出。

我所做的唯一相关更改是将 CListView 派生类重命名为 MyCFileListView,并填充列表。

填充列表:

其中 FileInfo 只是一个容器(应该是一个结构):

并且 program_state.file_list 是这样声明的:


我已经浏览了 MS 在 CListViews、WIN32 ListViews AKA WC_LISTVIEW、它们的样式和扩展样式上的页面,但找不到关于此行为的任何内容:

...以及其他太多,无法列出。

就好像这种行为非常好,以至于没有人愿意禁用它:-)

0 投票
0 回答
41 浏览

windows - IInputObjectSite 和 IInputObject 之间的正确控制流程是什么?

有谁知道上述接口之间完整、正确的控制流程?

显然,当输入对象获得焦点时,它会调用IInputObjectSite::OnFocusChangeIS让站点知道。然后当消息通过时,站点调用IInputObject::TranslateAcceleratorIO让输入对象在发送前处理消息。

但是还有更多方法,我不确定何时应该调用它们:IInputObject::HasFocusIOIInputObject::UIActivateIO. 有谁知道该网站何时应该调用这些?

0 投票
1 回答
61 浏览

c++ - 在调用 IsDialogMessage 之前测试键值的必要性

我看过几个 代码 示例WM_KEYFIRST,它们测试消息的值以确定它WM_KEYLAST在调用IsDialogMessage.

我想知道这在技术上是否有必要。天生就不 IsDialogMessage会这样做吗?或者在调用函数之前测试值是否更有效?