2

開いているプロセスまたはアプリケーションのテキスト ボックスを見つけて、その値を変更する必要があります。しかし、私はC#の方法でそれをやりたいです。知ってる人いたら教えてくれませんか?または、C++ を使用する必要がありますか?

アドバイスありがとうございます。

4

3 に答える 3

2

これを行う 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");

これにより、問題のウィンドウへのハンドルが得られます。

これを行う別の方法は、ウィンドウを見つけて、そのウィンドウにいくつかのイベントを渡すことです。たとえば、ウィンドウにフォーカスを合わせてから、プログラムでテキスト ボックスをタブで移動します。ただし、正確に何をしようとしているのかについての詳細情報がなければ、ここで他に何を言うべきかわかりません.

于 2013-05-03T22:01:56.050 に答える
0

あなたが探しているツールはUI Automationです。他のプログラムのコントロールを表示し、それらのコントロールにテキストを送信できます。過去に、破損したデータベースからデータをエクスポートする必要があり、破損したレコードにヒットするたびにダイアログで [OK] をクリックする必要がありました。

このトピックは複雑すぎて、SO 回答のスペースでそれを行う方法について詳しく説明することはできませんが、これは CodePlexで見つけた方法を説明するチュートリアルです。

簡単に実行できるようにするサードパーティのラッパー ライブラリもあります。私の個人的なお気に入りはです。

于 2013-05-03T22:52:03.083 に答える