Swanman's Horizon

性欲をもてあましつつなんらかの話をするよ。

macOSでDockメニューに独自項目を追加する。

サンプルコード

uses
  ...,
  System.Messaging,
  Macapi.ObjCRuntime, Macapi.ObjectiveC, Macapi.AppKit, Macapi.Helpers,
  FMX.Helpers.Mac;

procedure TForm1.FormCreate(Sender: TObject);
begin
  TMessageManager.DefaultManager.SubscribeToMessage(TApplicationDockMenuMessage,
    procedure(const Sender: TObject; const M: TMessageBase)
    var
      menu: NSMenu;
      item: NSMenuItem;
    begin
      menu := TNSMenu.Create;
      TNSAutoreleasePool.OCClass.addObject((menu as ILocalObject).GetObjectID);

      item := menu.addItemWithTitle(StrToNSStr('AAA'), sel_getUid('onMenuClicked:'), StrToNSStr(''));
      item.setTag(1);
      item := menu.addItemWithTitle(StrToNSStr('BBB'), sel_getUid('onMenuClicked:'), StrToNSStr(''));
      item.setTag(2);

      TApplicationDockMenuMessage(M).Value.ReturnValue := menu;
    end);

  TMessageManager.DefaultManager.SubscribeToMessage(TApplicationMenuClickedMessage,
    procedure(const Sender: TObject; const M: TMessageBase)
    var
      item: NSMenuItem;
    begin
      item := TApplicationMenuClickedMessage(M).Value.Sender as NSMenuItem;
      case item.tag of
        1: ... // AAA
        2: ... // BBB
      end;
    end);
end;