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

申し訳ありませんが、これはクリスの回答のフォローアップですが、OPにはもう少し支援が必要なようです。

また、ジョイスティック コンポーネントを使用するのがよい方法だと思います。

たとえば、NLDJoystickです。インストール手順とミニマニュアルが含まれています。

次の手順に従う必要があります。

  • コンポーネントをフォームに配置し、
  • True に設定Activeします (ジョイスティックが接続されていない場合、これは成功しません)。
  • 次のようにイベントを実装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;
    

    AdvancedFalse (デフォルト設定) の場合、サポートされるボタンは 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 に答える