1

使用下面的代码,或者修改它,可以实现我的目标吗?或者不使用此代码,但它必须是当窗体隐藏在托盘中时使用的操纵杆按钮。谢谢

type
  TForm125 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    HotKey1 : Integer;
    procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
  public

  end;

var
  Form125: TForm125;

implementation

{$R *.dfm}


procedure TForm125.FormCreate(Sender: TObject);
begin
  HotKey1 := GlobalAddAtom('MyAppHotkey1');//create a unique value for identify the hotkey
  if not RegisterHotKey(Handle, HotKey1, MOD_CONTROL, VK_F1) then //register the hotkey CTRL + F1
   ShowMessage('Sorry can not register the hotkey');
end;

procedure TForm125.FormDestroy(Sender: TObject);
begin
  UnRegisterHotKey(Handle, HotKey1);//unregister the hotkey
  GlobalDeleteAtom(HotKey1);//remove the atom
end;

procedure TForm125.WMHotKey(var Msg: TWMHotKey);
begin
  if Msg.HotKey = HotKey1 then
    ShowMessage('Hello'); // do your stuff
end;
4

2 回答 2

4

抱歉,这是对Chris 回答的跟进,但似乎 OP 需要更多帮助。

我也相信使用操纵杆组件是要走的路。

例如,NLDJoystick。包括安装说明以及迷你手册。

您将需要执行以下步骤:

  • 将组件放在表单上,
  • 设置Active为 True (当没有连接操纵杆时,这不会成功),
  • 实现OnButtonDown事件,如下:

    procedure TForm1.NLDJoystick1ButtonDown(Sender: TNLDJoystick;
      const Buttons: TJoyButtons);
    begin
      Beep;
    end;
    

    TJoyButtons类型是 a ,因此set of JoyBtn1..JoyBtn32如果您希望可以对特定按钮或多个按下按钮的组合做出反应:

    procedure TForm1.NLDJoystick1ButtonDown(Sender: TNLDJoystick;
      const Buttons: TJoyButtons);
    begin
      if JoyBtn1 in Buttons then Beep;
      //or:
      if Buttons = [JoyBtn1, JoyBtn2] then Beep;            
    end;
    

    请注意,如果Advanced为 False(默认设置),则仅支持 4 个按钮。

于 2011-10-28T18:24:32.223 回答
3

当您需要检查操纵杆按钮的状态时,您可以检查它们的状态......即使表单被隐藏也能正常工作:

uses ..., MMSystem;

const
  iJoystick = 1; // ID of the joystick
var
  myjoy    : TJoyInfoEx;
begin
  myjoy.dwSize  := SizeOf(myjoy);
  myjoy.dwFlags := JOY_RETURNALL;

  if (joyGetPosEx(iJoystick, @myjoy) = JOYERR_NOERROR) then
  begin
    if (myjoy.wbuttons and joy_button1)  > 0 then // you can do it for all the buttons you need
    begin
      ShowMessage('button 1 down');
    end;
  end;
end;

最终,您可以创建一个计时器,该计时器经常检查其状态以了解状态是否已更改并触发您需要的内容...

于 2011-10-25T17:33:30.980 回答