私は、パケットを形成し、パケットデータを外部プログラムに送信して送信するアプリケーションを持っています。私はすべてが機能しているが、私が知っている唯一の方法は、ウィンドウを最優先にする必要はないということだ。ただし、メッセージの先頭には常に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);
あなたは正しいです、それはDelphiならば書かれています。ソースもありますが、Delphiコンパイラはありません。ハードドライブが故障する前に私はそれを持っていましたが、私がインストールしたBorland Delphi 7のダウンロードは見つかりませんでした。 アプリケーションに関しては、問題はUnicode文字ではないと私は考えています。さもなければ、私はそれが正しいと思います。 対象のアプリケーションを編集する場合は、何を覚えていましたか?私はDelphiでコーディングしたことがなく、アプリケーションは私によって作られていません。 – ozdrgnaDiies
だから、D7は間違いなくUnicodeではありません。 Delphiアプリケーションを変更することができれば、メモリマップされたファイルの使用など、あらゆる種類のプロセス間通信機能があります。また、WM_CHAR(あなたの0x102定数)ではなく、wm_copydataを使って一度に文字列全体を送信することもできます。 Delphiアプリケーションの大きさはどれくらいですか? –
アプリケーションはかなり小さいです。基本的には、送受信されるパケットを監視するメインウィンドウと、データを与えた後にパケットを送信できる第2のウィンドウがあります。 2番目のウィンドウは、送信するデータが必要なウィンドウです。私は、WM_COPYDATA定数を使用してみましたが、私は全く動作することはありませんでした。私は私の使用が間違っていると確信しています。基本的に 'SendMessage(TEditHandle、WM_COPYDATA、TEditParentHandle、ref CopyDataStructure); – ozdrgnaDiies