2012-04-02 24 views
2

他のプログラムでは、プログラムで編集ボックスにテキストを設定したいです。これはゲームアプリケーションで、directXを使用していますが、ウィンドウモードで実行します。私はこれをやっている:SendMessageを使用して、別のプロセスに属する編集コントロールにテキストを入力する

HWND hWnd = FindWindow(NULL,"Game"); 
HWND edit = FindWindowEx(hWnd, NULL, "Edit", NULL); 

SendMessage(edit, WM_CHAR, (TCHAR) 'H', 0); 
SendMessage(edit, WM_CHAR, (TCHAR) 'E', 0); 
SendMessage(edit, WM_CHAR, (TCHAR) 'L', 0); 
SendMessage(edit, WM_CHAR, (TCHAR) 'L', 0); 
SendMessage(edit, WM_CHAR, (TCHAR) 'O', 0); 

これは私のために働いていない....しかし、いくつかの方法一度働いた。私は何かを誤解していると思うかもしれませんが、おそらくコントロールの編集に焦点を当てて、カーソルをセットしてテキストを貼り付けてフォーカスを無効にする必要があります...私は本当に多くを知らないのです...時間と神経を保存して、 ....

作業私もこれを試みたが、動作していない:

SendMessage(hwnd, WM_SETTEXT, NULL, (LPARAM)"text"); 

HWNDは正しいのですが、テキストは更新されません...それは正しいハンドルに送るが、更新されません....私は何とかフォーカスや更新をする必要があると思う、それが成功した更新が、私は何が起こったか分からなかった...コードは一度働いたが、それ以上の作業...なぜ一度働いたの?

+2

? –

+0

@デビッドHeffernanの 私はこれを試してみましたが、動作していない: のSendMessage(HWND、WM_SETTEXT、NULL、(LPARAM) "のMyText"); 私はテキストを設定する前に、フォーカスやその他のことを設定する必要があると思う...しかし、どのように? – Jigberto

+2

FindWindow呼び出しでのエラーチェックはありません。彼らは働いていますか?はい、デバッグを済ませていなければなりませんか? –

答えて

4

あなたの質問はお金です! 真剣に。小さな鳥があなたが興味を持っているゲームが何であるか教えてください(Sで始まります)。私はこの問題について数時間を過ごしました。私はいくつかの成功を収めました。私はあなたと共有します。

Spy++という名前のツールがあります(Microsoftから提供されています)。ウィンドウ/クラスに送信されるメッセージを見てみましょう。これは、キーボードでキーが押されたときにEDITボックスに送信されるメッセージを監視できるため、この操作をシミュレートするためにゲームに送信される正確な呼び出しとパラメータを見つけることができるため、デバッグに最適です。

spy ++を使用してゲームプロセスを開くと、Gameのログインウィンドウに入ると、spy ++はこのプロセスで開かれたいくつかのスレッドを報告しますが、1つのスレッドだけが3 EDITボックスを持つことがわかります。それはあなたが興味を持っているスレッドです!

HWND edit = FindWindowEx(hWnd, NULL, "Edit", NULL); 

と方法によって、常に他のFindWindowEx()戻り、有効な何かが、どのようにあなたがいることを知っているだろうことを確認してください:

はまた、次のコードは動作しませんので、編集ボックスのどちらも、キャプションを持っていることに気づきます編集ボックスの検索に成功しましたか?あなたの代わりに何をすべき

は次のとおりです。

HWND edit = FindWindowEx(hWnd, NULL, "", NULL); 
if (!edit) 
{ 
    // report error 
} 

そして、これが最初の編集ボックスを見つけます。このボックスはユーザー名ボックスに対応します。あなたがしようとしていたとして、ゲームがキーを押しをシミュレートするために、3つのPostMessage()呼び出しを使用し、ないSendMessage()

// "..." means you need to find out the other parameters 
PostMessage(edit, WM_KEYDOWN, ...); 
PostMessage(edit, WM_CHAR, ...); 
PostMessage(edit, WM_KEYUP, ...); 

スパイを++、他のパラメータが何であるかを明らかにし、心配しないでください。おそらく、コールの最後のパラメータがどのように構築されているか(マスクなので)、時間を費やすことになります。

それが最小化またはフォーカスなした場合、私はゲームの鍵を送信することができていません。あなたはこれを理解しなければなりません。テスト目的のために、SetForegroundWindow(window_hwnd);といくつかのものを使用してウィンドウをフォーカスすることができます。あなただけではなく、偽のタイピングに触れることは避け `WM_SETTEXT`を使用していないのはなぜ

2

ソースコードを探してAutoit. Autoitはキー/マウスを何かに送信することができます。 新しいバージョンのKaspersky AntiVirusがインストールされると、プロセス間で種類がSendMessage|SendInputになります。

編集:AutoItのは、このタスクを達成するために通過掘るためにコードの巨大な塊であることを指摘して人々のため :

のAutoItが注入された入力を表示したくないバックグラウンドのアプリに入力を送信することができます。それは簡単な作業ではありません。ゲームの中には、どのような形式のスクリプト入力も見たくないし、それを防ぐために外出するゲームがあります。また、プロセス間入力インジェクションをブロックするAVソリューションもあります。 Autoitは何とかして、多くの場合ブロックの周りに働きます。

+0

ニースのポイントを私の答えをチェックしてください。オートチェンジャーのソースコードの巨大なボディとそれを理解しようとしていますか?私に最も生産的なアプローチを聞かない –

+2

は疑いをダウンロードするには、本当にあなたの答えである - 。=(問題に関する詳しい情報は、AVソフトウェアに関する –

+0

テキストを送信したいこのプログラムはゲームであり、マウスを動かすとエディットボックスを隠すそれはマウスカーソルが上に移動したときに表示されるので、テキストを送信する前にフォーカスまたは有効にする必要があるかもしれませんが、その方法を知りません... Spy ++で表示しようとしますメッセージは..... – Jigberto

関連する問題