问题标签 [getmessage]

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 投票
0 回答
636 浏览

hook - 如何在 AutoIt 中挂钩和使用 WH_GETMESSAGE

有人可以举例说明如何将 WH_GETMESSAGE 挂接到 AutoIt 中以查找桌面上的所有系统/应用程序窗口消息,并在窗口移动时执行某些操作,以及如何从发送消息的窗口存储句柄?

0 投票
1 回答
352 浏览

hook - GetMessage(WM_CHAR) 覆盖?确保所有其他 Window Hooks 激活

我正在寻找一种方法来拦截外部进程中对WM_CHAR的GetMessage()调用(具体来说,只有活动窗口)。我对使用SetWindowsHookEx()犹豫不决- 我想绝对确保可能修改键盘输入的最广泛的程序有机会首先触发。有没有人有什么建议?

语境:我正在构建一个应用程序,旨在生成当前键盘布局的视觉效果。但是,我希望使其尽可能与第三方键盘重新映射软件(包括用户制作的 AutoHotkey 脚本等)兼容。当通过热键触发时,我的程序将按键发送到活动窗口(扫描码 + 适当的虚拟键),它应该由其窗口过程处理......从而触发任何基于系统范围挂钩的重映射软件和具有被编程为仅重新映射活动应用程序中的键......然后我的程序将拦截生成的 WM_CHAR / WM_UNICHAR / WM_DEADCHAR 消息,从中重建键盘布局。实际上,字符消息不应该到达输出的活动窗口。

PS抱歉,这可能是一种糟糕的礼仪——注册后首先发布一个问题——但我已经研究这个问题很多个晚上了,但我仍然没有找到最佳解决方案!我主要从 AutoHotkey 工作,我完全愿意分享我考虑过的其他方法来获得真正的当前键盘布局,但它们都有其局限性:与重新映射软件玩得很好。

0 投票
0 回答
158 浏览

c++ - 从 dll 创建自定义 main

我正在围绕 .NET 和 Win API 创建一个层。在用户进入主函数之前我需要准备一些东西,比如调用GetMessage函数。

是否可以从 dll 启动程序,然后在单独的线程上调用自定义主函数?

如果我让在不同的线程上GetMessage运行会更容易,但是一旦我调用主要威胁,鼠标就会大大减慢几乎一分钟,就好像我根本没有调用一样。但是当我在 Visual Studio 中调试时,它确实输入了,所以这不是问题。SetWindowsHookExWH_MOUSE_LLGetMessageGetMessage

希望有人可以提供帮助。

更新

这就是我想要实现的目标。

用户源(cpp)

我的DLL (cpp)

0 投票
1 回答
2015 浏览

c++ - 结合 GetMessage 和 PeekMessage

我打算创建一个带有 2 个窗口的小应用程序,一个带有控件的普通窗口和一个 3D 窗口,用 DirectX 渲染。推荐用于 3D 窗口PeekMessage(),因为它在检查消息后不会等待,但对于普通窗口(无 3D 渲染),该GetMessage()函数用于避免处理器无意义的过度使用。因此,当 3D 窗口处于活动状态(WM_ACTIVE收到消息)时,我想使用PeekMessage(),而当普通窗口处于活动状态时,我想使用GetMessage()

主循环如下所示:

在这些窗口的消息处理程序中,我有WM_ACTIVATE消息:

我对 TaskManager 的期望是在 3D 窗口处于活动状态时显示应用程序繁忙(大约 50% 的处理器使用),而在正常窗口处于活动状态时显示应用程序繁忙(大约 5% 的处理器使用)。当两个窗口都失去焦点时,我只看到 50% 的处理器使用率,但当它们中的任何一个处于活动状态时,我看到 0-5% 的处理器使用率。我相信应该有区别,所以我不确定这是否真的有效(甚至可能)。3D 窗口被渲染,普通窗口也响应事件,但处理器的使用让我感到困惑。我只是不希望这影响 3D 窗口的 F​​PS。

0 投票
2 回答
1009 浏览

ruby - 为什么线程状态是死的?

就是那个问题。我使用线程调用了一个函数,但是当我返回主控时,主控会在几分钟内进入睡眠状态。

示例(Look这是调用 Win32API 函数的行GetMessage):

此代码应打印e1000 次的状态,但它只打印一次。我找不到合理的错误。Look在收到消息之前不会返回,所以我怀疑这可能会导致错误。

0 投票
1 回答
2037 浏览

winapi - Win32 - 从另一个线程获取消息

根据这个线程:CreateWindow/CreateDialog 中的 HWND 可以从另一个线程中获取消息吗?,看来我不能使用主线程的HWND在另一个线程中使用GetMessage。

我只是试图使用从新线程调用的 GetMessage 来获取编辑文本中的值。我有什么方法可以做到这一点?

0 投票
1 回答
144 浏览

getmessage - GetMessage() 函数无限调用自身(不退出循环)

我正在实现类似类型的东西 - 我在下面代码的 else 部分中有一些消息框..我在调试时得到的是 - 我一次又一次地有相同的消息框并且它没有结束(这使得我的程序崩溃,我需要重新启动我的笔记本电脑)..有什么解决方案吗?我正在使用 MFC 应用程序并在窗口资源管理器的预览窗格上创建一个按钮。一切都很好,但这是一个问题,一旦我进入下面的循环,我就无法出来(我的意思是 DispatchMessage 或 TranslateMessage 中有一些东西一次又一次地调用这个函数)..我不能找到那是什么??

代码如下-

0 投票
2 回答
766 浏览

winapi - getmessage 内的无限循环(DispatchMessage(& msg); 不起作用)

我正在使用资源编辑器创建一个按钮应用程序。创建按钮后,我尝试这样做 -

在其他地方,我定义了这样的createdialog函数-//该函数仅在createDialogParam()函数上调用。在它之后,控件转到getmessage,所有内容都在循环。

发生的问题是,当我首次使用它时,控件首先转到 CreateDialogParam,然后转到 getmessage,其中控件没有退出循环导致重新启动问题。而且我在预览窗格中没有显示按钮和图像。如果一切顺利,我期望的是在调试后它应该在预览窗格上显示图片,我有 2 个按钮“下一步”和“上一个”,但它只显示一个空白窗口(我已经使用资源编辑器创建的按钮和照片.. .这是正确的我很确定)..但我不知道为什么我没有出来getmessage函数并且没有调用dispatchmessage(因为我在调试时看到了)。

0 投票
1 回答
865 浏览

winapi - DllMain DLL_PROCESS_DETACH 和 GetMessage 函数重入

我编写了一个全局挂钩,它使用SetWindowsHookEx挂钩WH_GETMESSAGE、WH_CALLWNDPROC 和 WH_CALLWNDPROCRET。
钩子 dll 在钩子进程中创建一个新线程,除其他外,该线程检查进程的音频状态并调用IAudioSessionManager2::GetSessionEnumerator()

现在有趣的部分是,我从钩子主机调用了UnhookWindowsHookEx()并且在我的 dll 的工作线程运行对IAudioSessionManager2::GetSessionEnumerator()的调用期间。该调用位于同一个线程的调用堆栈中,其中调用了带有 DLL_PROCESS_DETACH 的 DllMain。我认为原因是GetSessionEnumerator()在某处调用GetMessage()函数,而后者是可重入的。不幸的是,我记不清了,但我想我在调用堆栈中看到了。

但是有很多重要的事情我想知道并且仍然不清楚。所以这里有我的相关问题:

  1. 是否可以随时调用带有 DLL_PROCESS_DETACH 的 DllMain,即使是在运行当前正在卸载的 dll 中的函数的线程中?
  2. 当 DllMain DLL_PROCESS_DETACH 退出时,堆栈上的函数会发生什么?调用堆栈上的函数中的代码最终会执行吗?
  3. 如果这些功能不退出怎么办?dll什么时候卸载?
  4. DllMain DLL_PROCESS_DETACH 是否可以在 WH_GETMESSAGE、WH_CALLWNDPROC 和 WH_CALLWNDPROCRET 挂钩的回调期间被类似地调用?我知道并且已经通过实验证实,有时,虽然不是太频繁,但这些函数是可重入的,所以对这些函数的调用可以在上一次调用仍在同一个堆栈中运行的时间内注入,但我不知道是否也调用DllMain 可以以类似的方式注入。
  5. 何时可以在线程中准确调用 DllMain - 是否有一些特定的 Windows API 函数需要调用,而这又可能导致 DllMain DLL_PROCESS_DETACH 调用,或者它可能发生在任何指令中?
  6. 如果 DllMain DLL_PROCESS_DETACH 调用可以随时“注入”并且调用堆栈上的函数不再执行,那么我如何知道调用堆栈上的函数在哪里被中断?所以我可以在 DllMain 内部释放一些由函数在堆栈上分配的句柄或资源。
  7. 有什么方法可以暂时阻止/推迟对 DllMain DLL_PROCESS_DETACH 的调用?如果调用/中断发生在同一个堆栈中,锁显然没有帮助。

不幸的是,我可能无法通过实验解决这些问题,因为我已经在多台计算机上运行了几个月的挂钩(以及取消挂钩)代码,然后在取消挂钩期间发生 DllMain 的这种情况。尽管由于某种原因,它同时出现了四个不同的程序......


另外请有足够声誉的人喜欢合并标签“reentrant”和“reentrancy”吗?

0 投票
2 回答
73 浏览

c++ - WinAPI 销毁前一个窗口后创建另一个窗口

我知道如何创建子窗口。但是,如果我想创建一个窗口(例如自定义设置)并在销毁它之后再创建一个窗口(基于HGE引擎)怎么办。如果我可以通过 WM_DESTROY 打破消息循环,我可以在此消息循环之后创建第二个窗口。但据我所知,GetMessage仅在 WM_QUIT 消息中返回 0,我无法发送此消息,因为这意味着:“关闭应用程序”而不是“关闭窗口”。所以我的问题是:当第一个窗口获得 WM_DESTROY 时,我怎样才能打破消息循环?这真的可能吗?