0

パケットを形成し、パケット データを外部プログラムに送信して送信するアプリケーションがあります。すべてが機能していますが、ウィンドウを最前面にする必要がない唯一の方法は、PostMessage です。ただし、メッセージの先頭で常に 0 ~ 2 文字を失うようです。紛失を防ぐためにチェックを行う方法はありますか?GetLastError() をループして、0 の場合は再送信しようとしましたが、何の役にも立ちません。これまでに取得したコードは次のとおりです。

    public void SendPacket(string packet)
    {
        //Get window name
        IntPtr hWnd = Window.FindWindow(null, "???????????");
        //Get the first edit box handle
        IntPtr edithWnd = Window.FindWindowEx(hWnd, IntPtr.Zero, "TEdit", "");
        //Get the handle for the send button
        IntPtr buttonhWnd = Window.FindWindowEx(hWnd, IntPtr.Zero, "TButton", "SEND");
        //Iterate twice to get the edit box I need
        edithWnd = Window.FindWindowEx(hWnd, edithWnd, "TEdit", "");
        edithWnd = Window.FindWindowEx(hWnd, edithWnd, "TEdit", "");
        foreach (Char c in packet)
        {
            SendCheck(c, edithWnd);
        }
        //Press button
        TextSend.PostMessageA(buttonhWnd, 0x00F5, 0, 0);
        //Clear the edit box
        TextSend.SendMessage(edithWnd, 0x000C, IntPtr.Zero, "");
    }

    public void SendCheck(char c, IntPtr handle)
    {
        //Send the character
        TextSend.PostMessageA(handle, 0x102, c, 1);
        //If error code is 0 (failure), resend that character
        if (TextSend.GetLastError() == 0)
            SendCheck(c, handle);
        return;
    }

TextSend クラスの定義は次のとおりです。

        [DllImport("Kernel32.dll")]
        public static extern int GetLastError();
        [return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, string s);  
4

1 に答える 1

1

TEdit と TButton が見つかったという事実から、対象のアプリケーションは Delphi で作成されたと思われます。その場合、Delphi のバージョンによっては、Unicode アプリケーションである場合とそうでない場合があります。PostMessageW の代わりに PostMessageA を呼び出しています。これは、C# アプリケーションから 16 ビット Unicode char ではなく、1 バイトの Ansi char を送信していることを意味します。

ターゲット アプリケーションへのソースはありますか? 編集ボックスにデータを詰め込んでボタンをクリックするのは、少し壊れやすいようです。ターゲット アプリケーションを変更できる場合は、一度に 1 文字ずつ送信する以外のオプションが利用できることは確かです。

于 2012-01-02T02:46:05.337 に答える