開いているプロセスまたはアプリケーションのテキスト ボックスを見つけて、その値を変更する必要があります。しかし、私はC#の方法でそれをやりたいです。知ってる人いたら教えてくれませんか?または、C++ を使用する必要がありますか?
アドバイスありがとうございます。
これを行う 1 つの方法は、アプリケーションがライブラリとラッパーの使用に関して制御できない場合です。
Process[] Procs = Process.GetProcessesByName("NameofProcess");
問題のプロセスが得られます。ここからがトリッキーになり、正確に何をする必要があるかによって異なります。
最終的には、文字列がメモリに格納されている場所を見つける必要があります。メモリプロファイラーを使用してこれを行うか、CheatEngine のようなものを使用して値を見つけることができます。メモリの場所を見つける簡単な方法です。
次に、次のようなものを使用してメモリの場所を読み書きできます。
[DllImport("kernel32.dll")]
public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesRead);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out int lpNumberOfBytesWritten);
public static byte[] ReadMem(IntPtr MemAddy, uint bytestoread, Process Proc)
{
//
//Create new Memory buffer and pointer to that buffer
//
byte[] buffer = new byte[bytestoread];
IntPtr bufferptr;
//
//Read Process Memory and output to buffer
//
ReadProcessMemory(Proc.Handle, MemAddy, buffer, bytestoread, out bufferptr);
//
//Return the buffer
//
return buffer;
}
public static bool WriteMem(IntPtr MemAddy, byte[] buffer, Process Proc)
{
int NumWriten;
WriteProcessMemory(Proc.Handle, MemAddy, buffer, (uint)buffer.Length, out NumWriten);
if (NumWriten != buffer.Length)
{
return false;
}
else return true;
}
これらの 2 つの関数を使用すると、任意のプロセスのメモリ ロケーションに対して読み書きを行うことができます。
問題のウィンドウが必要な場合は、次を使用できます。
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
そのようです:
IntPtr HWND = FindWindow(null, "WinName");
これにより、問題のウィンドウへのハンドルが得られます。
これを行う別の方法は、ウィンドウを見つけて、そのウィンドウにいくつかのイベントを渡すことです。たとえば、ウィンドウにフォーカスを合わせてから、プログラムでテキスト ボックスをタブで移動します。ただし、正確に何をしようとしているのかについての詳細情報がなければ、ここで他に何を言うべきかわかりません.
あなたが探しているツールはUI Automationです。他のプログラムのコントロールを表示し、それらのコントロールにテキストを送信できます。過去に、破損したデータベースからデータをエクスポートする必要があり、破損したレコードにヒットするたびにダイアログで [OK] をクリックする必要がありました。
このトピックは複雑すぎて、SO 回答のスペースでそれを行う方法について詳しく説明することはできませんが、これは CodePlexで見つけた方法を説明するチュートリアルです。
簡単に実行できるようにするサードパーティのラッパー ライブラリもあります。私の個人的なお気に入りは白です。