Yurios
Yurios

Reputation: 123

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;

Upvotes: 1

Views: 1147

Answers (2)

NGLN
NGLN

Reputation: 43669

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.

Upvotes: 4

Whiler
Whiler

Reputation: 8086

You can check the state of the buttons of your joystick(s) when you need to check them... if works even if the form is hidden:

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;

Eventually, you can create a timer which often checks their status to know if the status has change and trigger what you need...

Upvotes: 3

Related Questions