【问题标题】:C# - get event from SetWindowTextC# - 从 SetWindowText 获取事件
【发布时间】:2010-12-15 03:22:33
【问题描述】:

我们正在为现有的 VB6 应用程序(通过 COM 互操作)编写插件,并且我们需要一些他们不支持的功能。如果我们能够以某种方式接收特定控件在其窗口上的文本更改时的事件,我们就可以轻松获得所需的功能。

我们已经可以使用 FindWindow 获取控件的现有窗口句柄并使用 GetWindowText 获取文本。

当窗口上的文本发生更改时,是否有任何非托管/pinvoke 方法来接收事件?

我们不想使用 while 循环进行轮询 - 我们可能希望将来在他们的几个控件上执行此操作。

PS - 我知道有一些方法可以拦截 p/invoke 调用(谷歌 EasyHook),但我们不想拦截对 SetWindowText 的每个调用。我们只想为一个控件接收它,而使用 EasyHook 之类的东西可能会增加不必要的复杂性。

【问题讨论】:

    标签: c# events com vb6 pinvoke


    【解决方案1】:

    您可以尝试在 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

    【讨论】:

    【解决方案2】:

    一般窗口没有这样的事件。如果控件是 Edit 控件,它可能会通过 WM_NOTIFY 向其父级发送 EN_CHANGE,但是您不能将托管代码注入另一个进程以拦截通知。建议你联系VB6应用的作者为你添加COM事件,或者放弃通知要求。

    【讨论】:

    • 遗憾的是,该应用程序太旧了,原始开发人员没有(或者可能无法)添加任何更改。我想评论一下,我们实际上处于同一个进程中,他们的应用程序正在将我们的 C# 程序集加载为 ActiveX 控件并将其放置在他们的表单上,这会打开任何东西吗?
    • 视情况而定,窗口的窗口类是什么?
    猜你喜欢
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多