【解決方法】C# の SendMessage 関数を使用して文字列を別のアプリケーションに送信する

プログラミングQA

[ad_1]

こんにちは、みんな!
別のアプリケーションに文字列を送信しようとしています。
私がこれをやろうとしている方法は、Windows APIのSendMessage関数を使用することであり、WParamパラメータを文字列値に設定しています(関数をインポートしたとき、このパラメータには文字列タイプを使用しました)。
今、受信側アプリでメッセージを受信し、WParam値の内容をテキストボックスに入れるように設定していますが、問題は文字列がないことです(「Hello World!」のテスト文字列を使用しました)。たくさんの数字があり、それらの数字をテキスト ボックスに入力するだけです。 それで、私は何を間違っているのでしょうか?
送信アプリで使用しているコードは次のとおりです。
これらは、SendMessage メソッドに使用しているパラメータです

C#
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern string SendMessage(int hWnd, int msg, string wParam, IntPtr lParam);

この行は、フォーム内のボタンがクリックされたときに実行されます。

C#
ParentFormHandle = ParentHandle.ToInt32();
SendMessage(ParentFormHandle, 40, "Hello World!", IntPtr.Zero);

これは私が受信アプリで使用しているコードです:

C#
protected override void WndProc(ref Message m)
{
    if (m.Msg == 40)
    {
        YourTextBoxNameHere.Text += m.WParam.ToString();
    }
    else
    {
        base.WndProc(ref m);
    }
}

これは、文字列「Hello World!」を含む WParam プロパティの結果です。
39061140
これで、送信アプリを閉じて再度開くたびに、この値が変更されます。
誰かがアプリケーションに文字列を送信するより良い方法を持っている場合は、私に知らせてください。
事前にご協力いただきありがとうございます、
マスターコデオン

解決策 1

1) P/Invoke が正しくないようです。
2) カスタムメッセージを送信したい場合は、次を使用します。 WM_USER+X[^]、10 進数 40 ではなく 0x0400 から始まります。
3) ParentFormHanlde??? 他のウィンドウのハンドルとは思えません…
4) 動作するサンプルについては、ここを参照してください (メッセージが他のものであっても): http://www.codingvision.net/miscellaneous/c-send-text-to-notepad[^]

5) 電話したほうがいいですよ base.WndProc! ただし、WndProc には干渉しないほうがよいでしょう。 ただし、そうする場合は、それらのアプリケーションがメモリを共有しないことを考慮する必要があるため、送信された文字列ポインタを使用する前にコピーする必要があります。 ここを見て: https://boycook.wordpress.com/2008/07/29/c-win32-messaging-with-sendmessage-and-wm_copydata/[^]。 ヘルパー クラスはここで見つけることができます。 https://gist.github.com/BoyCook/5075907[^]

6) IPC には、Windows メッセージ API よりもはるかに優れたアプローチがあります。 それはそれだけのためではありません。 たとえば、ここを見てみましょう。 プロセス間通信 (IPC) の概要とサンプル コード[^]、 http://techmikael.blogspot.hu/2010/02/blazing-fast-ipc-in-net-4-wcf-vs.html[^]

解決策 2

よし、やったよ、はい!
この質問に関する背景情報:
フォームのオプションボックスを設定しようとしていて、文字列値をフォーム間で渡したいと思っていました。
私のメインアプリとオプションアプリ。 それで私はプロパティのアプローチを試しましたが、うまくいきませんでした。これは、フォームを独自のクラスではなくFormクラスとして宣言していたという事実によるものでした。

C#
//This Is The Wrong Way To Do It
Form newform = new MyFormOne();
//This Is The Correct Way To Do It
MyFormOne newform = new MyFormOne();

この質問をしたとき、自分が間違ったことをしたとは知らなかったので、Windows APIを使用して別のアプリに文字列を送信することにしましたが、その後すぐに、私が失敗したことに気づき、問題を修正しました。
ご協力いただきありがとうございます。
マスターコデオン

解決策 3

https://ja.nfscdict.com/%E5%88%A9%E7%94%A8%E8%80%85%E3%83%BB%E3%83%88%E3%83%BC%E3%82 %AF:チャーラ・ルビオ37

[ad_2]

コメント

タイトルとURLをコピーしました