我们正在为现有的VB6应用程序编写插件(通过COM互操作),我们需要一些他们不支持的功能。如果我们可以以某种方式接收某个控件在其窗口上的文本发生更改的事件,我们可以轻松获得所需的功能。
我们已经可以使用FindWindow获取控件的现有窗口句柄,并使用GetWindowText获取文本。
当窗口上的文本发生变化时,是否有任何非托管/ pinvoke方法接收事件?
我们不希望使用while循环进行轮询 - 我们可能希望将来在其中的几个控件上执行此操作。
PS - 我知道有办法拦截p / invoke调用(google EasyHook),但我们不想拦截每次调用SetWindowText。我们只想接收一个控件,使用像EasyHook这样的东西可能会增加不必要的复杂性。
答案 0 :(得分:2)
您可以尝试在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#类的实例,并使用hWnd为FindWindow控件调用AssignHandle函数。
有关详细信息和更深入的解释,请参阅此链接: Overriding WndProc in the NativeWindow class
答案 1 :(得分:1)
一般窗户没有此类事件。如果控件是Edit控件,它可能会通过WM_NOTIFY将EN_CHANGE发送到其父级,但是您无法将托管代码注入另一个进程来拦截通知。我建议您联系VB6应用程序的作者为您添加COM事件,或放弃通知要求。