0

実行中の別のアプリケーションのテキスト ボックスからテキストをコピーするアプリケーションを使用しています。これは、coredll.dll を使用して行います。しかし、問題は、コピーする必要があるテキストを返すために、実行中のアプリケーションの mainMenu をクリックする必要があることです。coredll.dll を使用して特定のメインメニューのハンドルを取得するにはどうすればよいですか? リモート Spy++ を使用してハンドラーを表示しましたが、どれがそれであるかを区別できません。ハンドラーには、メインメニューではなく、テキスト ボックスやラベルなどのコントロールのハンドラーのみが含まれます。私は Windows CE c# の作業の初心者です。

どうもありがとう :)

4

1 に答える 1

1

これには多くの p/invokes が必要になるため、C# コードの準備はできていませんが、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 ダイアログに入力して変更したら、[接続] メニュー項目をクリックする必要があります。これは、マウス クリックをシミュレートすることにより、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 を使用する必要があります。

したがって、メニューを実行する最も簡単な方法は、メニュー上でのマウス クリックをシミュレートすることです。

windows ce/モバイル デバイスのウィンドウを詳しく見るために、http://www.codeproject.com/Articles/9549/Capturing-Window-Controls-and-Modifying-theirの修正版 (小さい画面) を使用します。 -zDumpと呼ばれるプロップ: http://www.hjgode.de/wp/2009/06/11/zdump-take-a-look-inside-windows-ce/

外部ウィンドウのメニュー ハンドルを取得することは不可能であることがわかります。私の知る限り、外部プロセスの方法はありません。外部プロセス内で実行されるコードによって、DLL を挿入してウィンドウ ハンドルを取得できる可能性があります。

于 2014-10-02T04:11:22.933 に答える