按名称

时间:2016-10-31 18:05:54

标签: windows messages delphi-10.1-berlin

在Windows平板电脑上有两个屏幕键盘应用程序(我很清楚),c:\ program files \ common files \ microsoft shared \ ink \ tabtip.exe  和C:\ Windows \ System32 \ OSK.exe。

我希望捕获这些应用在启动时发送到我的应用程序的消息,放在我的应用程序之上,以及何时关闭。

然后我可以检查IsIconic是否尽可能地了解键盘的状态,以便我可以相应地调整我的应用程序显示。

使用spy ++我已经为TabTip捕获了以下消息:

  

< 000050> 00130426 P消息:0xC298 [已注册:" ImmersiveFocusNotification"] wParam:FFFFFFFC lParam:00000000

     

< 000051> 00130426 P消息:0xC297 [已注册:" TipCloseMenus"] wParam:00000000 lParam:00000000

     

< 000052> 00130426 P消息:0xC061 [已注册:" TabletInputPanelOpening"] wParam:00000000 lParam:00000000

我认为有一个Windows API调用允许我在操作系统中注册以在我的应用程序的窗口过程中接收这些消息,或使用消息处理程序proc来获取通知,但我可以&# 39;似乎找不到它。

虽然这些消息显示在我的应用程序的spy ++消息队列中,但我似乎无法在我的WindowProc中识别它们,Delphi也不允许我指定消息处理proc这些消息ID位于49xxx范围内。

有谁知道按名称注册这些邮件的方式?我认为通过采用像

这样的字符串是可能的
  

TabletInputPanelOpening

  

TipCloseMenus

这样当操作系统按该名称处理消息时,我的应用程序可以接收/处理它吗?

感谢。

更新:使用Application.OnMessage处理程序,如果忽略发送邮件的句柄,我可以收到邮件。我假设这意味着这是广播消息(?)。

我仍然需要知道如何注册以接收以下消息:

  

1)由PostMessage或SendMessage发送

     

2)使用RegisterWindowMessage

与系统建立      

3)有一个标识消息的命名常量,例如' TipCloseMenus'或者'任务栏处理'

更新#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;

感谢。

1 个答案:

答案 0 :(得分:1)

您不能为已注册的消息编写编译时消息处理程序,因为它们不使用静态消息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;