[ad_1]
こんにちは、みんな!
別のアプリケーションに文字列を送信しようとしています。
私がこれをやろうとしている方法は、Windows APIのSendMessage関数を使用することであり、WParamパラメータを文字列値に設定しています(関数をインポートしたとき、このパラメータには文字列タイプを使用しました)。
今、受信側アプリでメッセージを受信し、WParam値の内容をテキストボックスに入れるように設定していますが、問題は文字列がないことです(「Hello World!」のテスト文字列を使用しました)。たくさんの数字があり、それらの数字をテキスト ボックスに入力するだけです。 それで、私は何を間違っているのでしょうか?
送信アプリで使用しているコードは次のとおりです。
これらは、SendMessage メソッドに使用しているパラメータです
[DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern string SendMessage(int hWnd, int msg, string wParam, IntPtr lParam);
この行は、フォーム内のボタンがクリックされたときに実行されます。
ParentFormHandle = ParentHandle.ToInt32(); SendMessage(ParentFormHandle, 40, "Hello World!", IntPtr.Zero);
これは私が受信アプリで使用しているコードです:
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クラスとして宣言していたという事実によるものでした。
//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]
コメント