c#如何使用coredll.dll处理特定的mainmenu

时间:2014-10-01 13:59:57

标签: c# dll compact-framework windows-ce spy++

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

非常感谢:)

1 个答案:

答案 0 :(得分:1)

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

tscDialog.cpp是用于在Windows Mobile上识别和更改远程桌面移动(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 / mobile设备上的窗口,我使用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并通过在外部进程内运行的代码获取窗口句柄。