c#如何使用coredll.dll处理特定的主菜单

本文关键字:菜单 处理 何使用 coredll dll | 更新日期: 2023-09-27 18:25:10

我使用的应用程序从另一个正在运行的应用程序的文本框中复制文本。我通过使用coredll.dll来做到这一点。但问题是,应该单击正在运行的应用程序的mainMenu才能返回我需要复制的文本。如何使用coredll.dll获取特定主菜单的句柄?我使用远程Spy++来查看处理程序,但我无法区分它是哪一个。处理程序只包含文本框和标签等控件的处理程序,而不包含主菜单的处理程序。我是windows CE c#的新手。

非常感谢:)

c#如何使用coredll.dll处理特定的主菜单

我还没有准备好任何c#代码,因为这需要大量的p/调用,但要让您了解如何在windows CE/Mobile上"自动化"外国应用程序,请查看tscDialog.cpphttps://code.google.com/p/rdp-auto-login/source/browse/trunk/rdp-auto-login/tscDialog.cpp?r=20.

tscDialog.cpp是用于识别和更改windowsmobile上的远程桌面移动(RDM)对话框的代码。但首先我必须说,你可能无法在Windows Mobile中获得外部窗口的菜单(可能在Windows CE上工作),因为菜单不是外部窗口的窗口层次结构的一部分,而是桌面的一部分。

如果你查看tscdialog.cpp,你会发现函数scanTscWindow。这个枚举了RDM的所有窗口元素,以了解稍后自动登录的元素(用于调试和开发期间)。

填充并更改RDM对话框后,必须单击"连接"菜单项。这是在starTSC()函数中通过模拟鼠标点击来完成的:

                    //Solution two with mouse_event, click at 13,306. The 13 comes from the assumption that hight of
                    //menu bar is 26 pixel and I want to click in the mid
                    //this solution does work as keyb_event does work
                    //      normalized coordinates:
                    //      (0,0) = upper left corner
                    //      (0xFFFF,0xFFFF) = lower right corner
                    DWORD dX = (0xFFFF / iScreenWidth) * (80); // changed from 13 to width=240, 1/3=80
                    DWORD dY = (0xFFFF / iScreenHeight) * (iScreenHeight - 13);
                    DEBUGMSG(1, (L"mouse click at: %u, %u'n", dX * 0xFFFFFFFF / 240, dY * 0xFFFFFFFF / 320));
                    //SetForegroundWindow(hTscDialog); //dont mess with windows z-order
                    //this will make a cursor visible
                    mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN, dX, dY, 0, 0);
                    Sleep(5);
                    mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP, dX, dY, 0, 0);
                    Sleep(30);
                    /*
                    //this is what happens, if you tap the screen
                    mouse_event(MOUSEEVENTF_TOUCH | MOUSEEVENTF_LEFTDOWN, dX, dY, 0, 0);
                    mouse_event(MOUSEEVENTF_TOUCH | MOUSEEVENTF_LEFTUP, dX, dY, 0, 0);
                    //Sleep(3000);
                    */

要获取窗口(或输入字段)的文本,必须使用带有右侧窗口句柄的GetWindowText。

因此,执行菜单最简单的方法是模拟鼠标点击菜单。

为了更仔细地查看windos ce/移动设备上的窗口,我使用了http://www.codeproject.com/Articles/9549/Capturing-Window-Controls-and-Modifying-their-prop称为zDump:http://www.hjgode.de/wp/2009/06/11/zdump-take-a-look-inside-windows-ce/

您将看到,不可能获得外部窗口的菜单句柄。AFAIK没有办法进行外部处理。可能可以通过在外部进程中运行的代码注入DLL并获得窗口句柄。