Windowsタブレットには、2つのスクリーンキーボードアプリケーション(私が知っている)、c:\ program files \ common files \ microsoft shared \ ink \ tabtip.exe 、 Windows \ System32 \ OSK.exe。名前でWindows登録されたメッセージをキャプチャします。
私は、これらのアプリが起動され、自分のアプリの上に置かれたとき、および閉じるときに、自分のアプリに送信するメッセージをキャプチャしたいと思っています。
次に、IsIconicを保険として、できるだけキーボードの状態がわかるようにして、それに応じてアプリの表示を調整することができます。
< 000050> 00130426 Pメッセージ:0xC298 [登録: "ImmersiveFocusNotification"]のwParam:FFFFFFFCのlParam:00000000
< 000051>私はTabTipため、次のメッセージを撮影してきたスパイ++使用
00130426 Pメッセージ:0xC297 [登録されて: "TipCloseMenus"]のwParam:00000000 lParamに:00000000
< 000052> 00130426 Pメッセージ:0xC061 [登録されて: "TabletInputPanelOpening"]のwParam:00000000 lParamに:00000000
私は、OSに登録してアプリケーションのウィンドウプロシージャでこれらのメッセージを受け取ることができるWindows APIコールがあると思っていました。メッセージハンドラprocを使用して通知を受け取りましたが、それを見つけるようです。
これらのメッセージは、spy ++のアプリケーションのメッセージキューに表示されますが、私はWindowProcで識別できないようですが、DelphiではこれらのメッセージIDに対応するメッセージ処理procを指定することはできません。 49xxxの範囲。
名前でこれらのメッセージを登録する方法を知っている人はいますか? OSは、その名前のメッセージ私のアプリを処理するときになるように、私は
TipCloseMenus
または
をTabletInputPanelOpening
のような文字列を取ることによって、それが可能だと思いましたそれを受信/処理できますか?
ありがとうございました。
更新: Application.OnMessageハンドラでは、メッセージが送信されるハンドルを無視するとメッセージを受信できます。私はこれがブロードキャストメッセージ(?)であることを意味すると仮定しています。私はまだされているメッセージ受信に登録する方法を知っておく必要があり
:RegisterWindowMessage
3を使用してシステムを制定)のPostMessageかのSendMessage
2によって送信され
1)) 「TipCloseMenus」や「TaskbarCreated」などのメッセージを識別する名前付き定数を持つ
更新#2: RegisterWindowMessageとGetClipboardFormatNameが、登録されたウィンドウメッセージとクリップボード形式の両方を格納するために同じ内部テーブルを使用するように見えるという古い例が見つかりました。パラメーターとしてTMsg.messageを指定してGetClipboardFormatNameを呼び出すと、messageidのラベルが検索されます。したがって、これらのメッセージはある程度明らかに同じ内部テーブルに格納されています。説明するサンプルコードは次のとおりです。
function GetRegisteredWindowMessageLabel(var Msg: TMsg): UnicodeString; var ay: array[0..99] of Char; i: Integer; begin Result := ''; if (Msg.message <= $FFFF) and (Msg.message >= $C000) then begin i := GetClipboardFormatName(Msg.message,ay,Pred(SizeOf(ay))); if i > 0 then Result := StrPas(ay); end; end;
ありがとうございました。
これは、鉱山以外のアプリが登録されているというメッセージには該当しますか? 「HOOKUTIL_MSG」(osx.exe)や「TabletInputPanelOpening」など、私が求めているメッセージは、私が管理していない他のアプリからのものです。 RegisterWindowMessageは自分のカスタムメッセージを登録した場合にのみ適用されるという印象を受けましたか? – DeCoder
登録されたメッセージは、デスクトップセッション内でグローバルです。同じセッションで実行されている複数のアプリで同じメッセージが登録されている場合、同じID番号が割り当てられます。これにより、登録されたメッセージをIPCに使用することができます。これは[documentation](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644947.aspx)に記載されています: "* RegisterWindowMessage関数は、通常、2つの協力する2つの異なるアプリケーションが同じメッセージ文字列を登録する場合、アプリケーションは同じメッセージ値を返します。* " –
Thanks Remy。私はMSDNのドキュメントを見たが、何とかそれを逃した。これは、MSInkのTabTipキーボードに最適です。 OSKは別の問題です。私はspy ++がOSKによって登録されていることを示すHOOKUTIL_MSGとSHELLHOOKメッセージを捕まえることができないので、別の方法を見つける必要があります。あるいは、私はそれを間違って読んでいるかもしれない。どちらの方法でも、私はApplication.OnMessageでもApplication MainFormのカスタムWindowProcでも受け取ることはできません。 – DeCoder