1

外部プログラムにメッセージを送信します:

SendMessage(Handle, WM_CHAR, Ord('A'), 0);

しかし、別のプログラムでこのメッセージを受信する方法がわかりません。(WndProcなどを使用して)誰かが私にそれを説明してもらえますか?

ありがとうございました

4

2 に答える 2

2

カスタム Windows メッセージを送信および処理する方法を参照してください

テストされていないコード:

const

  WM_REFRESHSOMETHING = WM_USER + 6;

メッセージをキャッチするフォームでは、次のようなものが必要です。

...
procedure WMRefreshsomething(var ppbMsg : TMessage); message WM_REFRESHSOMETHING;
...

procedure YourForm.WMRefreshsomething(var ppbMsg : TMessage);
begin
  //Actions...
end;

そして、次のようなメッセージを送信できます。

SendMessageToAll(Handle, WM_REFRESHSOMETHING, 0, 0);

メッセージ WM_REFRESHSOMETHING を持つすべてのフォームに対して。

このコンパイル可能な例を参照してください

于 2011-02-23T15:11:52.920 に答える
2

一連のプログラムで次のコードを使用します。1 つのプログラムがプログラムを起動し、各プログラムが終了すると、終了したことを示すメッセージをランチャーに送り返します。プログラムの鍵は、HWND_BROADCAST パラメーターを使用することです。メッセージは、コンピューター上で実行中のすべてのプログラムに送信されますが、もちろん、正しいメッセージ ハンドラーを持っている人だけが処理します。メッセージを送信する必要があるプログラムで、次のように記述します。

SendMessage (HWND_BROADCAST, RegisterWindowMessage ('メッセージ'), 0, 0);

明らかに、'message' を、両方のプログラム (送信するプログラムと受信するプログラム) で一定の​​文字列に置き換えることになります。

受信プログラムにデータを渡すために SendMessage の lparam パラメータを使用することはお勧めしません。これはポインターであると想定されており、もちろん、プログラム 1 のデータへのポインターは、プログラム 2 のガベージを指します。倍長整数をポインターにキャストして送信することもできますが、受信側で逆参照する必要があります。

受信プログラムでは、

type
 TWMMYMessage = record
 Msg: Cardinal;   // ( first is the message ID )
 Handle: HWND;    // ( this is the wParam, Handle of sender)
 Info: Longint;   // ( this is lParam, pointer to our data)
 Result: Longint;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 wm_Launcher:= RegisterWindowMessage ('message')  
 // wm_launcher is a private member of TForm
 .
 .
 .
end;

procedure TForm1.DefaultHandler(var Message);
var
 ee: TWMMYMessage;

begin
 with TMessage (Message) do
  begin
   if (Msg = wm_Launcher) then
    begin
     ee.Msg:= Msg;
     ee.Handle:= wParam;
     ee.Info:= lParam;
     // Checking if this message is not from us
     if ee.Handle <> Handle then WmMyMessage(ee);
    end
   else inherited DefaultHandler(Message);
  end;
end;

procedure TForm1.WmMyMessage(var Msg: TWMMYMessage);
begin
 startbtnclick (nil)   // here we actually do something when the message is received
end;
于 2011-02-24T06:56:18.227 に答える