问题标签 [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.

0 投票
2 回答
1068 浏览

multithreading - EnumWindows 和 EnumChildWindows 让我的 Treeview 保持更新

我正在尝试制作一个类似于 Winspector Spy 的程序。我的问题是我希望我的虚拟树视图随时更新——也就是说,在创建窗口、销毁窗口等时更新它。当然,所有外部 HWND。

为此,我正在考虑编写一个包含所有 Handles + 信息的数据容器,并在单独的线程中执行 EnumWindows 和 EnumChildWindows,在那里我将用所述信息填充我的数据容器。

您会建议我这样做吗,还是您有其他解决方案?如果我这样做,那么我是否应该让我的线程在整个程序生命周期内运行,然后在其中有一个无限循环Execute,它将清除我的数据容器,并每秒再次填充它,还是什么?

这是我的数据容器:

0 投票
1 回答
1492 浏览

c++ - 获取 WM_KEYDOWN 消息中 lParam 参数的第 30 位

我需要通过 WM_KEYDOWN 消息获取 lParam 参数的第 30 位。写在这里的这一位让我知道之前是否按下了该键。这段代码正确吗?

0 投票
2 回答
1922 浏览

c# - 使用 Windows 消息按住 Alt 按钮

如何使用 Windows 消息按住 ALT 按钮?

是否有 WM_KEYHOLD 或类似的东西?

这是屏幕截图的代码,但我想有些东西是丢失的。我认为我使用的键码不好,对于 0x70 它发送 F1。对于 0x46,它会发送令人讨厌的窗口声音。

0 投票
1 回答
669 浏览

c# - 在 C# 中获取 Windows 消息的字符串?

我看到我可以在 Windows 消息中发送字符串。
但是如何从已处理的 Windows 消息中读取它们?

0 投票
3 回答
1579 浏览

multithreading - 线程如何通知没有窗口句柄的对象?

我是多线程的新手,但不是一个完整的新手。我需要在工作线程中执行对 Web 服务的调用。

在主线程中,我有一个带有私有数据成员(私有字符串)的表单(TForm),只有工作线程才会写入(我在线程恢复之前将指向它的指针传递给线程)。当工作线程完成其 web 服务调用并将生成的响应 xml 写入表单上的私有成员时,工作线程使用 PostMessage 将消息发送到表单的句柄(在恢复之前我也将其传递给线程)。

It works great, but now I want to do the same thing from a datamodule (which doesn't have a Handle)... so I would really appreciate some useful code to supplement the working model I have.

EDIT

What I really want is the code (if possible) that would allow me to replace the line

with

0 投票
1 回答
906 浏览

delphi - 如何在 Delphi 中找到发送消息的位置?

我有一个第三方树包(LMD 创新的 ElXTree),我在我的程序中用作网格。每当我选择一个单元格时,该行就会获得焦点并突出显示,就像我想要的那样。

当我通过单击网格中的一个单元格来调用提供的 Inplace 编辑器时,该行获得焦点。因为在编辑模式下选择了单元格,所以只有单元格被突出显示(而不是整行),这也是我想要的。

我不想要的是:当我就地编辑一个单元格时,我通过单击另一个单元格来调用它的就地编辑器,首先具有旧单元格的行被赋予焦点并突出显示。然后它立即将其焦点移开并取消突出显示,并且具有新单元格的行被赋予焦点并突出显示。然后,除了正在就地编辑的单元格之外,该新行立即变为未突出显示。这会导致烦人的双闪,我想摆脱它。

我有包的源代码,一直在调试。我敢肯定,如果我能找到引起双重聚焦的原因,我将能够弄清楚如何进行简单的修改来防止它。

当我放置断点时,我发现我处于 Forms 单元中 TApplication.Run 的消息处理循环中。此循环正在处理的许多消息中的两条是设置焦点的消息。我可以将程序逐行跟踪到 Classes 单元中的 StdWndProc,消息在此调度。我有关于消息的所有信息(句柄、参数等)。

我没有也不知道消息是从哪里发起的。调用堆栈中没有 ElXTree 单元可以提示我。其中一个例程必须独立于当前调用堆栈发送消息。

如果我能找出该消息是从哪里发送的(即发送它的例程),那么我就可以开始运行了。

有什么方法可以找到消息的发送位置吗?或者,还有其他方法可以解决我遇到的这个双重聚焦问题吗?

作为参考,我使用的是 Delphi 2009。


更多信息:

ElXTree 有几十个它自己的 Windows 消息可以使用。就我而言,两个相关的是:

当我在 WMSetFocus 例程中放置断点时,我得到以下调用堆栈:

调用堆栈

调用堆栈中唯一的另一个 ElXTree 例程是第 4 行的一个:

当我在这个例程中设置断点时,它似乎只传递到“继承”行,然后调用系统函数,最终到达处理消息的 StdWndProc(如我在原始问题中所述)。

准确跟踪所涉及的问题是我必须单击鼠标并将鼠标指针保持在程序中的可视控件上,同时还要通过代码进行调试。在调试时移动或使用鼠标的任何错误都可能导致额外的鼠标事件影响处理这使它成为一个真正的调试者。

但是我可以仔细追踪到 StdWndProc 并查看被调度的事件,该事件聚焦于该行。我似乎无法做的是找出消息的问题。

现在,为什么我不知道消息是什么问题?好吧,我假设它来自 David 所说的 PostMessage 或 SendMessage 命令。当我在 ElXTree 中查找所有这些调用的位置时,我只找到这 10 个:

前 7 个处理滚动条。接下来的 3 个是 ColorChange。

我已经查看了所有其他 LMD 组件例程以及发布消息,但看起来没有任何希望。

所以我仍然被困住,需要一个提示或线索来了解如何找到要求关注线路的消息的发件人。


解决方法:

好吧,一旦我意识到 Windows 正在启动鼠标事件,我就能够做一些事情来阻止大部分闪烁。虽然这是一个真正的黑客。如果有人知道更好的事情,我很想听听。

在 TElXTreeView.WndProc 中,我将继承的语句替换为以下内容:

这样做是阻止在调用的例程中发生多重聚焦。

它可以完成这项工作,除了在一种情况下:我单击可编辑条目时,它仍然会在进入编辑模式之前先突出显示该条目。这是因为高亮显示发生在 MouseDown 而进入编辑模式发生在 MouseUp。我也许能够找到解决这个问题的方法,但最初的尝试没有成功。但它并不像双闪那么糟糕,如果必须,我可以忍受它。

感谢那些帮助我推动大脑的人。接受的答案是大卫,他给了我关键线索。


……也许我说得太早了。我发现其他一些控件,例如带有网格的页面,在控件之间分页时不会更新。我尝试在 EndUpdate 之后添加刷新命令。一旦我这样做了,我又得到了双闪。这是一个真正的混乱问题。

我也许能够找到分页的解决方法,但我希望该控件的开发人员能够以更好的修复响应我。

这样的事情不是编程的乐趣之一。:-(

0 投票
1 回答
2754 浏览

c# - 向窗口发送 WM_KEYUP 消息会产生 OverflowException

我正在尝试实现一个程序,该程序将相同的消息发送到一个窗口,如果连续按下某个键,该窗口将被发送。这是应用程序代码的一部分(整个 Form1.cs 代码在此处):

到达代码中的 WM_KEYUP SendMessage 后,程序崩溃并给出错误:

我该如何解决这个错误?WM_KEYUP 之前的 4 个 SendMessage 调用工作正常,它们将 2 个字母“a”发送到记事本。

感谢您的回复

0 投票
1 回答
481 浏览

windows - 对话过程消息排序

我遇到了一些我认为是由对话过程中的消息排序引起的麻烦。为了避免更多的全局变量,我在对话框中添加了一条 WM_USER 消息来设置控件的颜色。消息处理代码只是将 COLORREF 存储在一个静态变量中。在 INITDIALOG 中,我做了一个 SendMessage(hDlg,WM_User...) (到对话框本身),然后是一个 SetDlgItemText 用于对话框中的静态控件。WM_CTLCOLORSTATIC 消息处理代码设置静态控件的颜色、背景颜色和字体。一切似乎都按预期工作,直到我用任务栏中的另一个应用程序覆盖了该应用程序。当我重新建立应用程序时,隐藏的静态控件部分从所需的颜色变为黑色。请注意,WM_CTLCOLORSTATIC 消息也更改的字体大小不受影响。无法重新生成此信息,因此 Windows 对话框处理必须将其保存在某处。由于应用程序和 Visual Studio 之间的交互,这当然是不可能调试的。当我替换了发送颜色的 SendMessage 方法时,只需设置一个全局变量,问题就消失了。

所以,我很好奇发送到对话框的消息以及它们发送的顺序?MSDN 说 SendMessage 在窗口处理完消息之前不会返回。所以我想这些消息一定是这样的

同时,静态控件正在处理 WM_CTLCOLORSTATIC 消息之前和之后的 WM_SETTEXT 消息。我想其他消息,如 WM_COMMAND/EN_CHANGE 也会生成和处理。

如果是这种情况,我看不出是什么导致了我的问题,也看不出是如何通过消除 SendMessages 来解决的。

0 投票
0 回答
1266 浏览

c++ - Windows 从 MFC 中的睡眠消息恢复

我正在为 Windows 开发一个程序,并且只有在 Windows xp 32 位上才会出现我的错误。

问题是当 Windows 处于睡眠模式并且我将其唤醒时,我的 GUI 就搞砸了。

我的程序连接到服务器,当计算机唤醒时,连接断开。我的 GUI 将进入登录面板并重新连接,但由于某种原因,GUI 显示仅显示重新连接的动画,同时显示最后一个屏幕中的所有其余组件。

它应该显示的是一个带有重新连接动画的空白屏幕。

我想捕捉系统在唤醒时传递给我的应用程序的事件/消息,以便在重新连接之前清除屏幕。

有什么办法吗?

0 投票
2 回答
125 浏览

c# - 从 C# 获取本机 Windows 应用程序的 wm_windowmoving

我需要观看一个用 c++ 编写的应用程序,并知道它何时移动,以便我的 c# windows 窗体应用程序可以随之移动。

我可以使用计时器轮询 c++ 应用程序的位置,但需要更好的解决方案。

如何查看一个应用程序的 Windows 消息以查看它是否已移动?

可以做到吗?

还是我需要找到一个 C++ dll 来完成它或编写一个?