掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
[FMX]ユーザー定義のWindowsメッセージを受信するには? (ID:48153)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
take様、返信有難う御座います。 >> VCL(Windows)とは勝手が違う様で、以下のコードでは受信できません。 > VCLでは動いているコードという解釈で良いですかね? はい、その通りです。 次のVCLコードは正常に受信できています。 [VCLコード] unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const WM_HOGEHOGE = WM_USER + 100; type TForm1 = class(TForm) Button1 : TButton; Edit1 : TEdit; procedure Button1Click( Sender : TObject ); procedure Message_WM_HOGEHOGE( var Msg : TMessage ); Message WM_HOGEHOGE; private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click( Sender : TObject ); begin PostMessage( Form1.Handle, WM_HOGEHOGE, WPARAM( 0 ), LPARAM( 0 ) ); end; procedure TForm1.Message_WM_HOGEHOGE( var Msg : TMessage ); begin Form1.Edit1.Text := 'HOGEHOGE受信'; end; end. VCLコード異なる点は、フォームハンドルの取得方法だけです。 FMXでは、Form1.Handle が Wnd から TWindowHandleに変更されている為、 WindowHandleToPlatform処理で取得しています。 take様のコードをFMXに組み込んでみましたが、WndProc関数に飛んで来ていないのです(申し訳ないです;;) もしかして、受信側ではなくメッセージを投げる方に問題が!?と思い始めて来ました。 [FMXコード] unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Edit, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Platform.Win, Winapi.Windows, Winapi.Messages; const WM_HOGEHOGE = WM_USER + 100; type TForm1 = class( TForm ) Button1 : TButton; Edit1 : TEdit; procedure Button1Click( Sender : TObject ); private { private 宣言 } FHandle: HWND; // ウインドウハンドル procedure WndProc( var Msg : TMessage ); public { public 宣言 } constructor Create; destructor Destroy; end; var Form1: TForm1; implementation {$R *.fmx} constructor TForm1.Create; begin FHandle := AllocateHWnd( WndProc ); // 独自ウインドウハンドルを生成 end; destructor TForm1.Destroy; begin DeallocateHWND( FHandle ); // 独自ウインドウハンドルを破棄 end; procedure TForm1.Button1Click( Sender : TObject ); var WindowHandle : TWinWindowHandle; begin WindowHandle := WindowHandleToPlatform( Form1.Handle ); Winapi.Windows.PostMessage( WindowHandle.Wnd, WM_HOGEHOGE, WPARAM( 0 ), LPARAM( 0 ) ); end; procedure TForm1.WndProc( var Msg : TMessage ); begin if Msg.Msg = WM_HOGEHOGE then // 自作ウインドウメッセージ通知の場合 begin Form1.Edit1.Text := 'HOGEHOGE受信'; Exit; end; if Msg.Msg <> WM_HOGEHOGE then // 自作ウインドウメッセージ通知では無い場合は処理を返す begin Msg.Result := DefWindowProc( FHandle,Msg.Msg, Msg.wParam, Msg.lParam ); Exit; end; end; end. ///// 通りすがり様、返信有難う御座います。 FMX内のメッセージング機構というのがあったんですね。 理解を進める為にじっくり読んでみます。 新しい Delphi は、複数のOS上での動作をサポートしていますが、 今の所、私のプログラムは Windows上での動作を前提に置いています。 Windowsメッセージに拘っているのは、他のアプリケーション(過去のVCLプログラム)との連携が今後必要であるかも知れないからです。 とりあえず簡単なメッセージ処理をするプログラムを組んでみようとしていた所、動作できなかったので質問に至った次第です。 何か判明した点があればまた書き込みをさせて頂きます。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.