C# - 从 SetWindowText 获取事件

标签 c# events com vb6 pinvoke

我们正在为现有的 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/

相关文章:

c# - 在派生类中覆盖它时不使用 MyBase.OnInit(e) 有什么影响?

jQuery : stop recursivity with event

c# - 如何使用 addHandler 引发事件

c++ - 如何在 Visual Studio 中的干净构建期间删除 dlldata.c?

.net - 在 .Net 和 COM 程序集之间传递数据的性能

c# - 在 EndAccept() 之前或之后开始接受新连接

c# - 通过数组循环项目的最佳实践

c# - CS0246 : Missing an assembly reference - works locally, 但不在网络服务器上

c# - 伪造键盘或鼠标事件

c++ - IThumbnailProvider 和 IInitializeWithItem