Search code examples
delphihotkeysjoystick

Using joystick (gamepad) buttons in form even if window hidden in tray. Is it possible in Delphi?


Using the code below, or maybe modifying it, possible to achive my goal? Or not by using this code, but it must be joystick buttons using when form is hidden in tray. Thanks

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;

Solution

  • Sorry, this is a follow up on Chris' answer, but it seems OP needs a little more assistance.

    I also believe that the use of a joystick component is the way to go.

    For example, NLDJoystick. The installation instructions are included, as well as a mini manual.

    You will need to follow these steps:

    • Place the component on your form,
    • Set Active to True (this won't succeed when there is no joystick attached),
    • Implement the OnButtonDown event, as follows:

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

      The TJoyButtons type is a set of JoyBtn1..JoyBtn32, so if you wish you can react to a specific button, or a combination of multiple pressed buttons:

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

      Note that if Advanced is False (the default setting) that there are only 4 buttons supported.