Использование кнопок джойстика (геймпада) в форме, даже если окно скрыто в трее. Возможно ли это в Delphi? - PullRequest
1 голос
/ 25 октября 2011

Используя приведенный ниже код или, возможно, изменив его, можно ли достичь моей цели? Или не с помощью этого кода, но это должны быть кнопки джойстика, когда форма скрыта в трее. Спасибо

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;

Ответы [ 2 ]

4 голосов
/ 28 октября 2011

Извините, это продолжение Крис ответил , но кажется, что OP нуждается в немного большей помощи.

Я также считаю, что использование компонента джойстикаидти.

Например, NLDJoystick .Прилагаются инструкции по установке, а также мини-руководство.

Вам нужно будет выполнить следующие шаги:

  • Поместите компонент в форму,
  • УстановитьActive в True (это не удастся, если не подключен джойстик),
  • Реализуйте событие OnButtonDown следующим образом:

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

    TJoyButtons типом является 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 кнопки.

3 голосов
/ 25 октября 2011

Вы можете проверить состояние кнопок вашего джойстика (ов), когда вам нужно проверить их ... если работает, даже если форма скрыта:

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;

В конце концов, вы можете создатьтаймер, который часто проверяет их статус, чтобы узнать, изменился ли статус, и вызвать то, что вам нужно ...

...