我们正在为现有的 VB6 应用程序编写一个插件(通过 COM 互操作),并且我们需要一些他们不支持的功能。如果我们能够以某种方式接收特定控件窗口上的文本发生变化的事件,我们就可以轻松获得所需的功能。
我们已经可以使用 FindWindow 获取控件的现有窗口句柄,并使用 GetWindowText 获取文本。
当窗口上的文本更改时,是否有任何非托管/pinvoke 方法可以接收事件?
我们不想使用 while 循环进行轮询 - 我们将来可能希望在他们的几个控件上执行此操作。
PS - 我知道有一些方法可以拦截 p/invoke 调用(google EasyHook),但我们不想拦截对 SetWindowText 的每个调用。我们只想为一个控件接收它,而使用 EasyHook 之类的东西可能会增加不必要的复杂性。
最佳答案
您可以尝试在 C# 中创建一个派生自 NativeWindow 的新类。
重写 WndProc 函数,如果消息的类型为 WM SETWINDOWTEXT,则添加您的功能 - 忽略所有其他消息并调用基类实现
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM SETWINDOWTEXT:
// Custom code here
break;
}
base.WndProc(ref m);
}
创建此 C# 类的实例,并使用您通过 FindWindow 获得的控件的 hWnd 调用AssignHandle 函数。
请参阅此链接以获取更多详细信息和更深入的解释: Overriding WndProc in the NativeWindow class
关于C# - 从 SetWindowText 获取事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1709597/