2016-10-31 25 views
0

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; 

ありがとうございました。

答えて

0

静的メッセージIDを使用しないため、登録メッセージのコンパイル時メッセージハンドラを記述することはできません。実行時にRegisterWindowMessage()に電話し、登録済みのIDを使用して受信メッセージをフィルタリングする必要があります。

var 
    msgImmersiveFocusNotification: UINT = 0; 
    msgTipCloseMenus: UINT = 0; 
    msgTabletInputPanelOpening: UINT = 0; 
    msgTaskbarCreated: UINT = 0; 

procedure TMainForm:FormCreate(Sender: TObject); 
begin 
    msgImmersiveFocusNotification := RegisterWindowMessage('ImmersiveFocusNotification'); 
    msgTipCloseMenus := RegisterWindowMessage('TipCloseMenus'); 
    msgTabletInputPanelOpening := RegisterWindowMessage('TabletInputPanelOpening'); 
    msgTaskbarCreated := RegisterWindowMessage('TaskbarCreated'); 
end; 

procedure TMainForm.WndProc(var Message: TMessage); 
begin 
    inherited; 
    if (msgImmersiveFocusNotification <> 0) and (Message.Msg = msgImmersiveFocusNotification) then 
    begin 
    //... 
    end 
    else if (msgTipCloseMenus <> 0) and (Message.Msg = msgTipCloseMenus) then 
    begin 
    //... 
    end 
    else if (msgTabletInputPanelOpening <> 0) and (Message.Msg = msgTabletInputPanelOpening) then 
    begin 
    //... 
    end 
    else if (msgTaskbarCreated <> 0) and (Message.Msg = msgTaskbarCreated) then 
    begin 
    //... 
    end; 
end; 
+0

これは、鉱山以外のアプリが登録されているというメッセージには該当しますか? 「HOOKUTIL_MSG」(osx.exe)や「TabletInputPanelOpening」など、私が求めているメッセージは、私が管理していない他のアプリからのものです。 RegisterWindowMessageは自分のカスタムメッセージを登録した場合にのみ適用されるという印象を受けましたか? – DeCoder

+0

登録されたメッセージは、デスクトップセッション内でグローバルです。同じセッションで実行されている複数のアプリで同じメッセージが登録されている場合、同じID番号が割り当てられます。これにより、登録されたメッセージをIPCに使用することができます。これは[documentation](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644947.aspx)に記載されています: "* RegisterWindowMessage関数は、通常、2つの協力する2つの異なるアプリケーションが同じメッセージ文字列を登録する場合、アプリケーションは同じメッセージ値を返します。* " –

+0

Thanks Remy。私はMSDNのドキュメントを見たが、何とかそれを逃した。これは、MSInkのTabTipキーボードに最適です。 OSKは別の問題です。私はspy ++がOSKによって登録されていることを示すHOOKUTIL_MSGとSHELLHOOKメッセージを捕まえることができないので、別の方法を見つける必要があります。あるいは、私はそれを間違って読んでいるかもしれない。どちらの方法でも、私はApplication.OnMessageでもApplication MainFormのカスタムWindowProcでも受け取ることはできません。 – DeCoder

関連する問題