1

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;
Yurios
  • 123
  • 12
  • 1
    What problem are you having with this code? Does it work for Ctrl+F1? What happens when you use the key code for the game buttons instead? – Rob Kennedy Oct 25 '11 at 13:46
  • This code code is sample. It works for Ctrl+F1. But if other window has it's as a hotkey - i goes mad (hotkeys conflict, if it may called...) So I decided to use joystick instead of keyboard – Yurios Oct 25 '11 at 14:28
  • 1
    So, in other words, this code is *completely* irrelevant to the problem you're trying to solve? Delete it and ask the question you *really* want the answer to. But consider that if another program can interfere with yours by using Ctrl+F1, it can just as easily interfere by using the control pad. You're not solving the problem; you're just shifting it somewhere else. – Rob Kennedy Oct 25 '11 at 16:22
  • It's half-irrelevant. I'have inserted it here as a sample, how i want to work it with joystick. I think the topic is correct and there is no use to ask another question – Yurios Oct 25 '11 at 16:42

2 Answers2

4

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.

Community
  • 1
  • 1
NGLN
  • 43,011
  • 8
  • 105
  • 200
3

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...

Whiler
  • 7,998
  • 4
  • 32
  • 56
  • Ok. Thank you, I'll try in two days, when i get joystick – Yurios Oct 25 '11 at 19:04
  • 1
    when you'll do it, check [this page](http://msdn.microsoft.com/en-us/library/dd757116%28v=vs.85%29.aspx) and the related links... (it helps me a lots when I played with it... – Whiler Oct 25 '11 at 20:00
  • thanks, but i have no clue how to use a MSDN. Often I see some links on it, but can't find meanings to apply it. The codes above - simple, the codes on MSDN - for me it's not easy to understand/ – Yurios Oct 26 '11 at 10:43