C# C中的WM_SETTEXT未触发TEXTUPDATED事件

C# C中的WM_SETTEXT未触发TEXTUPDATED事件,c#,user32,C#,User32,我一直在为我们的医疗系统开发一个替代现有“上下文管理”桥接应用程序的程序。我们正在远离使用原始桥接器创建的产品(桥接器在vbscript中使用我们正在远离的公司创建的库)。我创建了一个c#应用程序,它将从c#中的应用程序标题中提取所需的标识信息,然后解析这些信息 我现在遇到了一个问题,在SPY++中,我可以看到正在发送的消息已被接收,并且“text”属性已更新,但它从未在屏幕上刷新,当我激活按钮进行搜索时,它不起作用。下面是我现在所处位置的一个片段,我尝试过的内容在上面被注释掉了。我在谷歌上搜索

我一直在为我们的医疗系统开发一个替代现有“上下文管理”桥接应用程序的程序。我们正在远离使用原始桥接器创建的产品(桥接器在vbscript中使用我们正在远离的公司创建的库)。我创建了一个c#应用程序,它将从c#中的应用程序标题中提取所需的标识信息,然后解析这些信息

我现在遇到了一个问题,在SPY++中,我可以看到正在发送的消息已被接收,并且“text”属性已更新,但它从未在屏幕上刷新,当我激活按钮进行搜索时,它不起作用。下面是我现在所处位置的一个片段,我尝试过的内容在上面被注释掉了。我在谷歌上搜索了很多次,没有找到解决办法。有趣的是,当我在Spy++中查看消息并手动输入该字段时,我看到有许多不同的句柄正在更新

    //SendMessage(iSiteWindow.ElementAt(23).Handle, BM_CLICK, windowHandle, IntPtr.Zero);
SetForegroundWindow(windowHandle);

IntPtr hWndMRNBox = FindWindowByIndex(windowHandle, 23);
//SendMessage(iSiteWindow.ElementAt(19).Handle, WM_SETFOCUS, windowHandle, IntPtr.Zero);

//SendMessage(iSiteWindow.ElementAt(23).Handle, WM_SETFOCUS, windowHandle, IntPtr.Zero);

//SendMessage(iSiteWindow.ElementAt(23).Handle, WM_KEYDOWN, windowHandle, IntPtr.Zero);

SendMessage((IntPtr)iSiteWindow.ElementAt(23).Handle, WM_SETFOCUS, IntPtr.Zero,IntPtr.Zero);

SendMessage((IntPtr)iSiteWindow.ElementAt(23).Handle, WM_SETTEXT, IntPtr.Zero, new StringBuilder(mrns[0].ToString()));

//PostMessage((IntPtr)iSiteWindow.ElementAt(23).Handle, WM_KEYDOWN, (IntPtr)Keys.Right, IntPtr.Zero);

//PostMessage((IntPtr)iSiteWindow.ElementAt(23).Handle, WM_KEYUP, (IntPtr)Keys.Right, IntPtr.Zero);

//UpdateWindow(windowHandle);

UpdateWindow((IntPtr)iSiteWindow.ElementAt(23).Handle);

SendMessage(iSiteWindow.ElementAt(32).Handle, BM_CLICK, windowHandle, IntPtr.Zero);
有人看到过上述行为吗?我必须在不久的将来让它工作,我花了大约10个小时试图让最后一部分工作

如果你想要更多的代码,请告诉我


提前感谢您的反馈

对于
WM_SETTEXT
的第四个参数
lParam
不应该读取
mrns[0].ToString()
而不是传入
StringBuilder
对象吗?无论如何,可以说应该使用而不是使用非OO p-invoke
SendMessage
Hi Micky,我之前就走过这条路,但是我发现我必须将程序作为一个由应用程序控制的进程来启动,在这种情况下可能并不总是这样。你知道这是不是真的吗?不,你读到的可能是在自动化测试的背景下,UIA可以针对哪个,但也适用于应用程序的一般“远程控制”。他启动计算器只是为了确保它已经在运行,但您会注意到对
AutomationElement.RootElement.FindFirst
的调用实际上并不需要
过程
objectHi Micky,我试图使用Microsoft UI自动化系统,但我无法让它在表单上找到任何元素。我甚至雇佣了一位以前做过这种工作的同事。我的代码适用于其他形式,只是不适用于我尝试使用的形式长短不一的是,看起来我必须使用p-invoke发送消息。使用这种方法,我可以看到消息通过SPY++消息监视器到达了正确的位置。但是,屏幕上的文本永远不会更新,当单击搜索按钮时,它返回未过滤的搜索。有趣的是,SPY++在列表中以稍微抖动的图标显示数据需要进入的元素。当我使用微软的UIAccess(Inspect)时,我甚至看不到需要进入的编辑框。我试图将其插入的表单类型是一个SplitterWnd窗格(类名是AfxWnd90)。我不知道为什么它们没有显示在UIAccess选项卡中。我试图替换的是一个VBScriptlet,它使用第三方供应商提供的框架运行,我们将不再使用该框架。这里有人有什么见解吗?