如何从 C# 访问另一个应用程序的组合框

Posted

技术标签:

【中文标题】如何从 C# 访问另一个应用程序的组合框【英文标题】:How to access a Combobox another app from C# 【发布时间】:2018-08-24 21:25:36 【问题描述】:

我有一个独特的挑战。我的任务是从我自己的应用程序中操作第三方应用程序的控件,并且我仅限于 .Net 3.5。到目前为止,我可以将文本从剪贴板写入富文本框并单击按钮(感谢 Spy++):

        // paste text into Rich Text Box
        IntPtr hwndChild = FindWindowEx((IntPtr)handle, IntPtr.Zero, "WindowsForms10.RichEdit20W.app.0.378734a", null);
        SendMessage(hwndChild, Msgs.WM_PASTE, 0, IntPtr.Zero);

        // click OK button
        hwndChild = FindWindowEx((IntPtr)handle, IntPtr.Zero, "WindowsForms10.BUTTON.app.0.378734a", null);
        SendMessage(hwndChild, Msgs.BM_CLICK, 0, IntPtr.Zero);

现在我正在尝试访问另一个应用程序中的组合框,以将其数据源内容与从其他地方读取的值进行比较,如果该值与组合框中的值匹配,则在另一个应用程序的组合框中选择该值。我的应用程序是 C#。

我可以像这样使用 user32.dll 方法 FindWindowEx() 在其他应用程序中获取组合框的句柄:

hwndChild = FindWindowEx((IntPtr)handle, IntPtr.Zero, "WindowsForms10.STATIC.app.0.378734a", null);

我使用 Spy++ 查找组合框的类名,但不知道下一步该做什么。我试过这个:

        NativeMessage lpMsg = new NativeMessage();
        PeekMessage(out lpMsg, hwndChild, 0, 0, 0x0000); // set wRemoveMsg to 0x0000

但通话后 lpMsg 为空。无论如何,这是一个疯狂的猜测。有什么想法吗?

【问题讨论】:

***.com/questions/11961215/…。接受的答案并不能解决问题。看来,您需要一个 c++ 应用程序,它创建一个钩子,然后从托管代码执行回调 这个 cpuld 可以帮助你:pinvoke.net/default.aspx/Constants.CB_GETLBTEXTLEN 感谢@oldovets 和@ZorgoZ! 【参考方案1】:

我发誓我试过这个,但答案只是在将文本加载到剪贴板后使用它:

SendMessage(hwndChild, Msgs.WM_PASTE, 0, IntPtr.Zero);

我没有解决“我正在尝试访问另一个应用程序中的组合框以将其数据源内容与从其他地方读取的值进行比较,如果该值与组合框中的值匹配,则在其他应用程序的组合框”问题,但至少我可以粘贴进去。

【讨论】:

以上是关于如何从 C# 访问另一个应用程序的组合框的主要内容,如果未能解决你的问题,请参考以下文章

由于另一个组合框字符串值,如何更改组合框上的项目?

如何在访问中使用 VB 从选择查询中填充组合框?

如何创建一个可以一次填充多个组合框的方法?

如何从另一个线程更新 GUI 上的文本框 [重复]

从组合框中获取数据并使用它来获取另一个组合框中的数据

C# 使用数据库值更新组合框