问题标签 [windows-messages]
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.
delphi - 如何从表单外部捕获表单的某些事件?
我正在做一些需要监控许多表格的事情。从表单外部,并且不将任何代码放入表单内,我需要以某种方式从这些表单中捕获事件,最有可能以 Windows 消息的形式。但是,您将如何从与其相关的类之外捕获 Windows 消息?
我的项目有一个对象,它包装了它正在监视的每个表单,我认为这个处理将进入这个对象。本质上,当我创建要监视的表单时,我会创建一个相应的对象,该对象又会添加到所有已创建表单的列表中。最重要的是,当该表单关闭时,我必须知道这样才能从列表中删除该表单的包装对象。
这些事件包括:
- 最小化
- 最大化
- 恢复
- 关
- 聚焦/聚焦
我不想要的:
- 用于此处理的任何表单或表单单元内的任何代码
- 从任何自定义基本表单继承表单
- 使用表单的事件,例如
OnClose
因为它们将用于其他目的
我想要什么:
- 处理这些事件的 Windows 消息
- 关于如何从课堂外获取 Windows 消息的任何提示
- 我需要收听哪些 Windows 消息
用相同的信息但不同的方法重写了问题
c# - 使用 Windows 消息确定按钮是否被按住
我有一个程序,它使用 Windows 消息来了解是否单击了按钮:
这些按钮可以在任何地方按下,程序仍然会处理它们。
问题是,每当用户按住某个按钮时,该按钮执行的功能会在短时间内重复很多次。即使该功能不是那么重 - 它仍然会导致计算机冻结或工作缓慢几秒钟。
如果我知道按钮被按住,我只需执行一次该功能。
Windows 消息中是否有标志或其他内容表明该按钮被按住?
.net - 如何阻止我的应用程序接收某个“消息”?
找到可能的解决方案!
我相信我已经找到了解决办法!我将继续测试以确保它确实有效,但我充满希望:) 我已经详细说明了如何在编辑问题三中找到解决方案!
对于任何希望了解我的问题背后的完整背景以及我从这个问题的输入中尝试过的内容的人,请参阅: http: //pastebin.com/nTrEAkVj
随着我的研究和情况的进展,我会经常编辑这个(大多数工作日每天超过 3 次),所以如果你有兴趣或者对我的问题有一些信息或知识,请继续查看:)
快速背景:
我有一个我制作的应用程序,它可以通过更改我的屏幕保护程序或锁定我的工作站而崩溃,并且通常每当向它发送 WM_WININICHANGE/WM_SETTINGSCHANGE 消息时。
如果我可以通过更改我的屏幕保护程序持续使我的应用程序崩溃,那么这样做的一部分就是向我的应用程序发送某种消息(不一定是 Windows 消息,我的意思是最一般意义上的消息),这反过来对我的应用程序来说是灾难性的应用。因此,我试图找到一种方法来阻止导致我的问题的任何消息被我的应用程序处理。我知道这不是解决问题的最佳方法,因此您无需告诉我。查看背景信息或询问为什么这会让您感到困扰(有充分的理由)。
我的问题:
有几件事可以帮助我解决我的问题,根据相关性标记(1 最相关,3 稍微不太有用):
我正在尝试使用 Wndproc() 过滤掉我的消息,如下所示:
但是,根据 Windspector 的说法,WM_WININICHANGE 消息仍在发送到我的应用程序(这是有道理的),但它也被返回为 0 ......如果它工作正常,这不应该发生,它不应该返回什么,不应该吗?关于为什么这不能像我预期的那样工作以及如何使它工作的信息将非常有帮助!
我也尝试过使用消息过滤器:
然后添加到我的 mybase.load 处理方法:
Application.AddMessageFilter(新 MyMessageFilter())
但是它们似乎只过滤某些消息,而像我这样的消息显然没有被捕获。有关是否绝对不可能使用任何类型的过滤器来捕获 WM_ 消息或是否有可能使用消息过滤器来实现我的目标的其他方法的信息也会有所帮助。
我可以通过哪些其他方式(除了我发现的带有 message.msg = WM_WININICHANGE = 26 的一条 Windows 消息)更改我的屏幕保护程序向我的应用程序发送任何类型的消息?更改屏幕保护程序的另一种消息是否也可能是致命的?
如果有任何其他关于我的情况可能有用的信息,请告诉我,我会尽我所能!提前感谢您提供的任何帮助:)
编辑:
如果我只发送 WM_CHANGESETTING 消息,并让我的程序等待我发送消息的 sendmessagetimeout 的超时长度,那么我的程序不会崩溃......看起来响应是我的程序崩溃的原因。 。 有趣的。我绝对接近我的解决方案!我在想更多的测试应该让我找出一种方法来确保我的程序不响应消息。
编辑二:
我今天发现了一些非常有前途的东西:我完全像这样定义了我的 wndproc 函数:
然后我尝试运行我的程序,然后使用以下命令发送 WM_SETTINGCHANGE 消息:
在我制作的另一个程序中。那你问怎么了?好吧,我尝试了几次,每次都会弹出消息框(我为它选择的词是微不足道的),然后我尝试在按确定之前等待不同的时间,然后我会看到我的主窗体发生了什么。很多时候,没有什么不同,它仍然会崩溃。但偶尔,可能是 1/5 次,程序仍然会在之后重新发送!然后如果确实如此,我会尝试再次发送消息,然后再一次,通常他们会在程序的同一运行期间第二次失败,但偶尔会再次失败,大约是另外 1/5 次,程序不会再次崩溃。然后我试图让它崩溃两次。也没有时间,
我发现等待大约 5 秒似乎增加了我的几率:我触发消息的表单仍然是焦点(顶部栏将是蓝色),就在我按下冻结按钮之后,然后 msgbox 会弹出,与顶部也是蓝色的(我认为是焦点),它们都仍然“焦点”(至少是蓝色的哈哈)。然后大约 5 秒后,原始表格会失去焦点,看到之后,我会尝试点击确定。
我目前在想,等待一段时间然后确认消息框有时会使我的程序不会崩溃,因为它正在使消息超时,因此它不会返回。我不知道为什么返回的消息会影响我的程序实际执行的操作。这是澄清会有所帮助的领域:)
编辑三:
所以我在 Winspector 中寻找更多,我发现如果我等待 WM_ERASEBKGND 出现在我的桌面窗口中(这是在 Winspector 中标记为“sysListView32 'FolderView'”的窗口),然后在我的 msgbox 上点击“OK” ,那么程序就不会崩溃了,有意思!通常需要接近超时时间才能显示 WM_ERASEBKGND 消息的 sendmessagetimeout。这当然是在从我的自制测试应用程序发送 WM_SETTINGCHANGE 消息之后。
所以,在这之后,我决定多看看 Winspector,因为也许我可以找到更多有用的队列?由于显然等待 winspector 显示消息已发送到我的桌面,因此对于我的程序来说根本不是真正的修复。我在我的程序进程下发现了一些异常命名的窗口:一个名为“.NET -BroadcastEventWindow.2.0.0.0.378734a.0”,另一个名为“GDI+ Hook Window Class 'GDI+ Window'”,带有一个名为“IME”的子窗口默认输入法'"。
我决定查看发送到这些窗口的消息,看看它们是否接收到任何可识别的消息,例如 WM_SETTINGCHANGE 或 WM_ERASEBKGND。事实证明,他们不经常收到消息:GDI+ 在我看的时候没有收到任何消息,我不认为,但是 .NET -BroadcastEventWindow 收到了一些消息。当我单击我的应用程序窗口或之后的另一个窗口时,进入 BroadcastEventWindow 的那些大多只是 WM_appactivate 。
但是然后...我注意到 .Net BroadcastEventWindow 收到了我的 WM_CHANGESETTING 消息!!!!我查看显示的其他消息:不是很多,但我注意到当应用程序因错误而崩溃时,有一条我不认识的消息:WM_USER+7194 (0x201A)。嗯,让我们看看那是什么。在我用谷歌搜索之后,我发现它似乎是一个应用程序/用户定义的消息,然后在再次搜索与之相关的问题后,我注意到有人能够使用过滤器来过滤掉这个消息并解决一个问题他们的(http://www.pcreview.co.uk/forums/handling-wm_user-messages-t1315625.html)。至少对我来说值得一试吧?所以我重新添加了我之前尝试过的过滤器,并更改了要过滤的值。应用程序没有崩溃!!!!!!!
接下来我尝试让我的工作站锁定以查看它是否仍然崩溃(因为以前只是向它发送单独的 WM_CHANGESETTING 消息)。事实证明,它仍然崩溃了 :( 但是,我在 winspector 中再次查看了那个窗口,哦,嗯,两条新的 WM_USER 消息:WM_USER+7294(0x207E) 和 WM_USER+7189(0x2015)。所以我尝试将它们过滤掉太......然后它也不会在工作站锁定时崩溃!!!:D
到目前为止,我也注意到这对常规应用程序的使用没有不利影响!这是有道理的,因为我认为我的程序中没有故意涉及任何用户定义的消息。
在确保我的解决方案没有问题并且运行良好之前,我将把这个问题留得更久一些。感谢那些在调试的中间阶段给我一些建议的人:)
c# - 用于托管 MFC 窗口的 C# 中的 PreTranslateMessage
我们开发了一个 MFC 应用程序,其中主窗口在 DLL 中实现。为了改进它,我们正在考虑将其更改为 WPF 应用程序,其中“旧”本机窗口重新托管在 Wpf 窗口中。到目前为止,一切都很好。
但是,我们的旧 MFC 应用程序在应用程序级别捕获了一些消息(例如:阻止鼠标单击或键盘输入)。要在 WPF 应用程序中重新托管 MFC 窗口,我们需要一种方法从 WPF 应用程序中捕获这些,并要求旧的 MFC 窗口预翻译它们......
这可能吗?
我正在考虑在 HwndHost 中重新托管 MFC 窗口,然后添加一个消息挂钩。我的桥接 CLR-DLL 中的代码如下所示(并且没有实现我想要的):
任何人都可以帮忙吗?
windows - Win32中的消息队列是如何工作的?
我阅读了一些关于 Win32 以及消息循环如何工作的内容,但我仍然不清楚:消息队列中究竟存储了什么?对应于消息( , 等)的WM_COMMAND
整数值WM_CREATE
或指向MSG
包含消息整数值和其他内容(如wParam
,等)的结构的指针lParam
?
delphi - 在调试时有什么快速的方法可以在特定的 Windows 消息或 API 处停止?
所以我想在特定的 API 或 Windows 消息中放置一个断点。如果不在任何 Delphi 版本中编写代码,我找不到任何简单的方法来做到这一点。有没有办法做到这一点,因为我可以在内存访问中设置断点?
c++ - Windows CE 中的内存不足通知
当可用内存低于某个限制(用户可配置)时,有没有办法获得通知?我查看了 WM_HIBERNATE 事件,但似乎此事件的限制不是用户可配置的,并且是硬编码的(160KB ??)。我能想到的唯一方法是通过 GlobalMemoryStats() API 定期(每 5 秒??)轮询操作系统以获取可用内存,如果可用内存低于用户配置的限制,则向用户引发事件。有没有更好的办法?
此通知必须适用于从 Windows CE 5.0 和 Windows Mobile 6.5 开始的设备
.net - WM_CLOSE 和 SC_CLOSE 的区别
我只想知道这两个消息传递常量之间有什么区别。覆盖时我应该在方法中使用哪一个WndProc
来处理关闭按钮消息。
c# - PostMessage 到隐藏表单第一次不起作用
我有一个出现在系统托盘中的 C# WinForms 应用程序。应用程序在加载时隐藏主窗体:
对于同一个主窗体,我重写了 WndProc 以捕获自定义窗口消息(该消息通过RegisterWindowMessage
Win32 API 调用注册到 Windows)。
从外部 C++ 应用程序中,我使用 PostMessage 广播相同的自定义窗口消息。
当我在 C# 应用程序首次启动后执行上述代码时,它不会进入 WndProc。显示主窗体后(通过双击系统托盘图标,本质上是一个Show()
),捕获广播消息工作并在隐藏窗体后继续工作Hide()
。
Hide()
谁能解释我为什么在MainForm_Load
事件处理程序的第一个之后它不起作用?我是否过早隐藏表格?
EDIT1:似乎它与加载时隐藏无关。即使没有最初的隐藏,我的主窗体 WndProc 也只会在隐藏并重新显示后开始接受广播帖子......
winforms - 捕获某个按钮单击的 WndProc 消息
我的表单上有一个取消按钮。我想在WndProc
方法内部确定单击此Cancel
按钮并为其编写一些代码。这是绝对必要的,因为否则我无法取消所有其他尚未执行的控件验证事件。
请帮忙。
.NET - 2.0,WinForms