2012-01-02 7 views
0

私は、パケットを形成し、パケットデータを外部プログラムに送信して送信するアプリケーションを持っています。私はすべてが機能しているが、私が知っている唯一の方法は、ウィンドウを最優先にする必要はないということだ。ただし、メッセージの先頭には常に0〜2文字が表示されないようです。損失を防ぐためにチェックを行う方法はありますか?私はGetLastError()をループして試してみましたが、0の場合はそれを再送信しますが、それは役に立たないです。ここで私は今のところ得ているコードは次のとおりです。C#PostMessage - データの損失を防ぐには?

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); 

答えて

1

あなたはTEDITとのTButtonを発見しているという事実は、私がいることを考えさせますターゲットアプリケーションはDelphiで書かれました。その場合、DelphiのバージョンによってはUnicodeアプリケーションである場合とそうでない場合があります。 PostMessageWの代わりにPostMessageAを呼び出しています。つまり、c#アプリケーションから16ビットのUnicode文字の代わりに1バイトのAnsi文字を送信しています。

ターゲットアプリケーションのソースはありますか?編集ボックスにデータを格納してボタンをクリックすると、少し壊れやすいようです。ターゲットアプリケーションを変更できる場合は、一度に1つの文字を送信する以外の方法もあります。

+0

あなたは正しいです、それはDelphiならば書かれています。ソースもありますが、Delphiコンパイラはありません。ハードドライブが故障する前に私はそれを持っていましたが、私がインストールしたBorland Delphi 7のダウンロードは見つかりませんでした。 アプリケーションに関しては、問題はUnicode文字ではないと私は考えています。さもなければ、私はそれが正しいと思います。 対象のアプリケーションを編集する場合は、何を覚えていましたか?私はDelphiでコーディングしたことがなく、アプリケーションは私によって作られていません。 – ozdrgnaDiies

+0

だから、D7は間違いなくUnicodeではありません。 Delphiアプリケーションを変更することができれば、メモリマップされたファイルの使用など、あらゆる種類のプロセス間通信機能があります。また、WM_CHAR(あなたの0x102定数)ではなく、wm_copydataを使って一度に文字列全体を送信することもできます。 Delphiアプリケーションの大きさはどれくらいですか? –

+0

アプリケーションはかなり小さいです。基本的には、送受信されるパケットを監視するメインウィンドウと、データを与えた後にパケットを送信できる第2のウィンドウがあります。 2番目のウィンドウは、送信するデータが必要なウィンドウです。私は、WM_COPYDATA定数を使用してみましたが、私は全く動作することはありませんでした。私は私の使用が間違っていると確信しています。基本的に 'SendMessage(TEditHandle、WM_COPYDATA、TEditParentHandle、ref CopyDataStructure); – ozdrgnaDiies