2

ac# アプリと Delphi アプリの間の Windows メッセージに問題があります。

c# から c# および delphi から delphi でいくつかの例を実行しましたが、c# から delphi にはできません

これは、WM送信者コードである私の関連するc#アプリです

    void Game1_Exiting(object sender, EventArgs e)
    {
        Process[] Processes = Process.GetProcesses();

        foreach(Process p in Processes)
            if(p.ProcessName == Statics.MainAppProcessName)
                SendMessage(p.MainWindowHandle, WM_TOOTHUI, IntPtr.Zero, IntPtr.Zero);


    }

    private const int WM_TOOTHUI = 0xAAAA;
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int SendMessage(IntPtr hwnd, [MarshalAs(UnmanagedType.U4)] int Msg, IntPtr wParam, IntPtr lParam);

これは、WMレシーバーコードである私の関連するデルファイアプリです

    const
      WM_TOOTHUI = 43690;
    type
      private
        MsgHandlerHWND : HWND;
        procedure WndMethod(var Msg: TMessage);

    procedure TForm1.WndMethod(var Msg: TMessage);
    begin
      if Msg.Msg = WM_TOOTHUI then
      begin
        Caption := 'Message Recieved';
      end;
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      MsgHandlerHWND := AllocateHWnd(WndMethod);
    end;

前もって感謝します。

4

1 に答える 1

5

メッセージをメイン ウィンドウ ハンドルに送信しています。のインスタンスのハンドルですTForm1。しかし、ウィンドウ プロシージャは、別のウィンドウ ハンドル ( への呼び出しによって作成されたウィンドウ ハンドル) にアタッチされていますAllocateHWnd

簡単な修正は、を使用するのではなく、オーバーライドすることWndProcです。TForm1AllocateHWnd

// in your class declaration:
procedure WndProc(var Message: TMessage); override;

// the corresponding implementation:
procedure TForm1.WndProc(var Message: TMessage);
begin
  if Msg.Msg = WM_TOOTHUI then
  begin
    Caption := 'Message Recieved';
  end; 
  inherited;
end;

または、Mason が言うように、Delphi の特別なメッセージ処理構文を使用できます。

// in your class declaration:
procedure WMToothUI(var Message: TMessage); message WM_TOOTHUI;

// the corresponding implementation:
procedure TForm1.WMToothUI(var Message: TMessage);
begin
  Caption := 'Message Recieved';
end;

p.MainWindowHandleメイン ウィンドウのハンドルでさえない可能性もあります。古いバージョンの Delphi を使用している場合はp.MainWindowHandle、アプリケーションのハンドルApplication.Handle. その場合、目的のウィンドウを見つけるために C# コードでFindWindowまたはが必要になります。EnumWindows

また、Delphi で 16 進数を使用してメッセージ定数を宣言すると、コードがより明確になります。

WM_TOOTHUI = $AAAA;
于 2013-02-01T16:34:36.060 に答える