0

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

非常感谢 :)

4

1 回答 1

1

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

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

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

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

                    //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。

所以执行菜单最简单的方法就是模拟鼠标点击菜单。

为了更仔细地查看 windows 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 并通过在外部进程中运行的代码获取窗口句柄。

于 2014-10-02T04:11:22.933 回答