4

ゲーム用の簡単なボッティング プログラムを作成しようとしています。ゲームがフォーカスされていない場合や最小化されている場合でも、これが機能することを望みます。このため、SendInput() はグローバル イベントをシミュレートするため、使用できません。これを機能させるには、PostMessage() 関数を使用する必要があることがわかりました。メモ帳での入力をシミュレートするテスト プログラムを作成しました。

#include <Windows.h>
HWND handle = FindWindow(NULL,CStringW("Untitled - Notepad"));
HWND edit = FindWindowEx(handle, NULL, CStringW("Edit"), NULL);
PostMessage(edit, WM_CHAR, 'a', 0 );

この例では、メモ帳がフォーカスされていないか最小化されている場合でも、メモ帳で "a" のクリックを正常にシミュレートします。同様に、マウスイベントも機能するようになりました。

しかし、自分のゲームでこれと同じことをしようとすると、クリック コマンドを送信できません。調査の結果、元のハンドルは取得されているが、FindWindowEx() を呼び出すとアクセス許可が拒否され、ハンドルが返されないことがわかりました。

この機能をブロックする場合、別のプロセスへの「編集」アクセスを取得する方法はありますか?

4

2 に答える 2

1

もちろん、Windows ではそんなことは許されません。ユーザーのパスワードを盗もうとしたらどうなるでしょうか?? フォーカスがないときは、入力を受け取ることはできません!!

しかし、ここでいくつかのトリックを行うことができます: マウスまたはキーボード用のフック関数を作成し、この関数を DLL (EXE ではない) に実装する必要がありますSetWindowsHookExを使用してインストールし、DLL で IPC メカニズムを使用してマウスおよび/またはメインEXEへのキーボードメッセージ。

しかし、それに加えて:通常はラインが機能しますが

HWND handle = FindWindow(NULL,CStringW("Untitled - Notepad"));

敵は意味がありません.windowsは、少なくとも1つの文字列引数を取得するほとんどの関数のバージョンを持っている必要があります.1つは名前が.で終わるANSI用でAW. MSVC には、この設計に追加のレイヤーが呼び出さTCHARれ、define を使用して、そのようなすべての関数を ANSI または Wide のいずれかにマップするため、そのバージョンの API を使用している場合、CStringWワイド文字列を生成するものを直接使用することは賢明ではありません。また、Windows APIが機能するため、文字列リテラルを変換してから関数に渡すのはなぜchar*ですか? 次のいずれかを使用する必要があります。wchar_t*CString

// This also work with CStringA
HWND handleA = FindWindowA(NULL, "Untitled - Notepad");
// This also work with CStringW
HWND handleW = FindWindowW(NULL, L"Untitled - Notepad");
// This also work with CString
HWND handleT = FindWindow(NULL, _T("Untitled - Notepad") );
于 2012-11-08T00:00:51.247 に答える
0

テキストを送信しようとしているゲームは、クライアントの子から列挙できる Windows Edit コントロールを所有していますか? 参照しているエディット コントロールがクライアントのグラフィック コンテナーのエンティティである可能性が非常に高いです。その場合は、必要な機能を実現するためにクライアント ウィンドウ自体にメッセージをWM_KEYDOWN送信する必要がある場合があります。WM_KEYUP

それが役立つことを願っています。

于 2013-06-27T08:10:31.793 に答える