问题标签 [message-pump]

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 投票
3 回答
6175 浏览

python - 中途结束程序

pythoncom.PumpMessages()

据我了解,这条线基本上告诉程序永远等待。就我的目的而言,它似乎正在工作。但是,我希望能够在适当的刺激下结束该计划。如何结束上述行,或停止程序继续运行。

0 投票
3 回答
8402 浏览

c# - 如何在不窃取焦点和 P/Invoke 的情况下将消息(例如鼠标滚轮)转发到另一个控件?

当我用鼠标在这个控件上时,我想转发一条消息(例如 WM_MOUSEWHEEL),而不窃取焦点。这个问题可以很容易地解决,使用 IMessageFilter 拦截消息(将添加到应用程序消息泵中)并使用 P/Invoke(d) SendMessage() 转发它。问题是:我可以在不使用 P/Invoke 的情况下做同样的事情吗(我在 StackOverflow 中找到的解决方案使用 P/Invoke)?如果不是,为什么?

下面的代码是我使用 P/Invoke 的解决方案。我只用它new MessageForwarder(control, 0x20A)

}

编辑:我的答案中的完整解决方案

0 投票
2 回答
1150 浏览

.net - 为什么当我的表单托管在 MFC 应用程序中时,Application.Idle 永远不会触发?

我正在为 MFC 应用程序构建一个 .net 插件。我使用 WinForms 和 .net4 创建了一个表单。该表单在用户单击 MFC 应用程序中的按钮后显示。我的一个控件使用 Application.Idle 来完成一些任务。

问题是,似乎 Application.Idle 从未被解雇。

  • 在这种情况下,“应用程序”到底指的是什么?是整个 MFC 应用程序,还是 .net 表单?
  • 为什么 Application.Idle 不触发?

更新
我设法让它工作,这里有两种可能的解决方案:

  • 使用 Form.ShowDialog() 显示表单(因此表单运行自己的 .net 消息泵)
  • 创建一个 STA 线程,在 STA 线程上创建表单并调用 Application.Run()。然后你可以使用 Form.Show() (表单在它创建的线程中使用 .net 消息泵,在这种情况下:.net STA 线程)
0 投票
2 回答
657 浏览

c# - 在模式进度对话框启动时调用“Application.DoEvents”是否可以?

我有一个无法异步运行的冗长过程,因此就像在复制文件时使用资源管理器一样,我有一个进度对话框。我以模态方式显示对话框,然后执行操作(我们将其称为复制文件以使其保持抽象),更新进度对话框,并使用 Application.DoEvents() 泵送消息以保持应用程序主框架的绘制和响应。

由于对话框是模态的,用户除了观看或取消之外不能做任何事情。换句话说,他们无法选择菜单项或单击任何按钮。

我一直认为 Application.DoEvents 非常邪恶,因为您可以重新输入您不打算重新输入的代码。但在这种情况下,由于进度对话框是模态的,我看不出这是一个糟糕或危险的解决方案的原因。

我是否忽略了某些东西,或者使用 Application.DoEvents 发送消息是与模式对话框有关的合法事情?

0 投票
1 回答
131 浏览

c# - 如何将用户交互封装在一个方法中

我正在使用一个外部框架,该框架用一个方法定义了一个接口:

即包含身份验证的整个过程,包括用户交互(WinForms)。我想做的是:

AskTheUserForCredentials()现在实现的简单方法ShowErrorMessage()是在Form.ShowDialog()内部使用。这是非常糟糕的用户体验,因为实际身份验证过程的对话框消失了,并且错误消息出现在一个新的、必须单击以关闭对话框中。

我宁愿将它全部放在一个表单中,保持可见,适当地禁用文本框/按钮并自行显示错误消息。

在这个单一的阻塞方法调用中,您将如何做到这一点?

更新

迄今为止最好的解决方案是在内部实现一个消息泵AskTheUserForCredentials()

现在我们都知道消息泵远非干净。

这个解决方案到底有多糟糕?

有更好的吗?

更新 2

消息泵有一些陷阱:

  • 丑陋且不完全使用 CPU

  • 使用 White UIAutomation 工作非常缓慢

我最终将整个过程委托给了 ChrisBD 的对话(对话仅在最终成功或失败后关闭)。这需要更多时间来使用 IoC 将身份验证从 GUI 中抽象出来,但最终是干净的并且可以按预期工作。

0 投票
1 回答
2454 浏览

c++ - 无限循环中的 Windows 消息泵

我一直在为游戏制作 Window 类,但消息泵出现问题。

我从 Windows 提供的消息队列中提取事件并将它们发送到它们所属的窗口。这是翻译和调度的功能。

根据我对 Win32 编程的记忆,翻译和调度消息调用指定的 WindowProc,并使用消息的内容作为参数。所以这是我指定的 WindowProc ......

currWin、currhwnd 和 winMap 被定义为 Window.cpp 的局部变量,在顶部...

无论如何,调用distributeSystemMessages() 似乎会导致无限循环。

重要提示:游戏循环不在消息处理循环内,消息处理代码也不在其中。消息处理循环应该每帧清空一次消息队列,将每条消息发送到它所属的窗口。

这是Window.h ...

这是Window.cpp ...

0 投票
1 回答
1403 浏览

winforms - 当内部托管 WinForms 控件的 MFC 对话框被停用并再次激活时,没有响应

我指的是 msdn 文章“在 MFC 对话框中托管 Windows 窗体用户控件”[链接](http://msdn.microsoft.com/en-us/library/94t3ebxz.aspx),以重用 Windows 窗体用户MFC 旧应用程序中的控件。使用花哨的 DDX_ManagedControl 实用程序,我可以看到控件(MyPanel 类)嵌入到对话框中,甚至可以 100% 浏览选项卡。

然后我继续使托管对话框成为另一个模式对话框的子对话框,然后当我的 WinForms 面板上的一个文本框获得键盘焦点并且我切换到另一个应用程序窗口(不同的进程)以停用当前对话框时,问题就出现了,接下来当我再次激活 MFC 对话框时,它不再响应。

澄清问题的一些代码://在我的 MFC 子对话框中 CWinFormsControl m_ctrl1;

一些观察:

  1. 在上述情况下,如果我使用 Spy++ 监视当前进程中的所有 WM_ACTIVATEXXX 消息,我发现当有问题的停用和重新激活发生时,没有捕获到 WM_ACTIVATE 或 WM_ACTIVATEAPP 消息,也没有任何其他消息,即消息泵已死。
  2. 相比之下,对于仅具有 MFC 控件的普通 MFC 子对话框,当在一个文本框获得焦点后发生停用和重新激活时,它仍在响应并且我可以看到所有 WM_ACTIVATEXXX 消息。
  3. 如果我直接将我的 WinForms 控件托管到模态 MFC 对话框中,问题就消失了。但是,我需要一个临时无模式对话框,因为在我的情况下,我使用 TreeView,其中每个树节点将加载不同的无模式对话框。
0 投票
1 回答
1118 浏览

c++ - 从外部应用程序附加子窗口时的消息循环(泵)

我即将将子窗口附加到外部应用程序。子窗口将是一个无模式对话框。由于我不拥有外部应用程序(实际上是 Microsoft FSX)的源代码,因此我不知道如何挂钩到消息循环或LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)父窗口本身的回调。

我的附加应用程序在它自己的进程中运行,所以我是否需要编写自己的消息循环,或者我的回调是否会被父消息泵调用?

前进的正确方法是什么?

-- 编辑至关于SetWindowsHookEx功能的答案 --

值得注意的是:

  1. 如何使用 SetWindowsHookEx 和 WH_KEYBOARD 挂钩外部进程
  2. C# 中的 SetWindowsHookEx
  3. 也许不工作,另一个SetWindowsHookEx 示例
0 投票
3 回答
15458 浏览

vb.net - Visual Basic.NET:如何创建线程来更新 UI

处理计算量大的任务的常用 VB 方法是将其置于后台工作线程中,而主线程继续处理 UI。

不管出于何种原因,我需要反过来做这件事:主线程执行繁重的工作,而后台线程则更新 UI。

这是我到目前为止所拥有的。唯一的问题是,虽然 UI 窗口 (Form1) 确实被重绘,但您无法与其交互,甚至无法移动或调整它的大小(鼠标光标变为沙漏并且不会单击)。

编辑:理想情况下,我需要向客户展示这样的界面

客户端会这样调用它(实际上是在非托管 C++ 中通过 COM,但你得到了图片):

0 投票
2 回答
7737 浏览

c# - 控制台应用程序中的消息泵

我有一个用.NET 编写的相当简单的控制台应用程序。有时应用程序在没有操作员的情况下以批处理模式运行,有时它是“自掏腰包”运行的。如果它以批处理模式运行,则有一个定义的默认选项允许程序自动运行。如果存在操作员,则还有其他选项允许用户从功能列表中进行选择。

由于我不想进入的原因,命令行参数不是首选。相反,我创建了一个 10 秒的窗口,操作员可以在其中选择一个功能。目前,我正在使用一个简单的 while 循环并从“in”流中读取输入。我在末尾添加了一个Thread.Sleep调用,以防止 while 循环完全消耗处理器,但我想知道是否有更好的方法。

在 Windows 应用程序(Windows 窗体WPF)中有一个消息泵,它能够读取消息队列,然后将控制权返回给系统。即使是 Visual Studio、 SAS Enterprise GuideSQL Server Management Studio等重型应用程序,它们在空闲时也几乎使用了 0% 的处理器。我的控制台应用程序可以达到同样的效果吗?

Thread.Sleep 正在工作,但是,正如我所说,我想知道是否有更好的方法。

这是源代码:

注意:这个问题不关心超时......它是关于在等待响应时使用 0% 的处理器时间(如窗口应用程序)。