即使窗口隐藏在托盘中,也可以在表单中使用操纵杆(游戏手柄)按钮。德尔福可以吗?

Posted

技术标签:

【中文标题】即使窗口隐藏在托盘中,也可以在表单中使用操纵杆(游戏手柄)按钮。德尔福可以吗?【英文标题】:Using joystick (gamepad) buttons in form even if window hidden in tray. Is it possible in Delphi? 【发布时间】:2011-12-14 22:14:43 【问题描述】:

使用下面的代码,或者修改它,可以实现我的目标吗? 或者不使用此代码,但它必须是当窗体隐藏在托盘中时使用的操纵杆按钮。 谢谢

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;

【问题讨论】:

这段代码有什么问题?它适用于Ctrl + F1吗?当您使用游戏按钮的键码代替时会发生什么? 此代码为示例。它适用于 Ctrl+F1。但是如果其他窗口有它作为热键 - 我会发疯(热键冲突,如果它可能调用......)所以我决定使用操纵杆而不是键盘 所以,换句话说,这段代码完全与您要解决的问题无关?删除它并提出你真正想要回答的问题。但是考虑一下,如果另一个程序可以通过使用 Ctrl+F1 干扰您的程序,那么使用控制板也可以很容易地进行干扰。你没有解决问题;您只是将其转移到其他地方。 半无关紧要。我已将其作为示例插入此处,我想如何使用操纵杆进行操作。我觉得题目是对的,再问也没用 【参考方案1】:

抱歉,这是对 Chris' answer 的跟进,但似乎 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 个按钮。

【讨论】:

+1 表示要加倍努力帮助 OP。我正在删除我的,这应该会清理评论混乱。【参考方案2】:

当您需要检查游戏杆按钮的状态时,您可以检查它们的状态...即使表单被隐藏也能正常工作:

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;

最终,您可以创建一个计时器,该计时器经常检查其状态以了解状态是否发生变化并触发您需要的内容...

【讨论】:

好的。谢谢,我过两天试试,等我拿到摇杆的时候 当你会做的时候,检查this page和相关链接......(当我玩它时它对我有很大帮助...... 谢谢,但我不知道如何使用 MSDN。我经常在上面看到一些链接,但找不到应用它的含义。上面的代码——简单,MSDN上的代码——对我来说并不容易理解/

以上是关于即使窗口隐藏在托盘中,也可以在表单中使用操纵杆(游戏手柄)按钮。德尔福可以吗?的主要内容,如果未能解决你的问题,请参考以下文章

WPF:即使显式设置 WindowState,窗口也会保持最小化

Win7 32/64以上隐藏托盘图标

隐藏Gnome标题栏以及更改系统托盘

outlook2013如何设置最小化

Qt开发实现系统托盘,托盘菜单,托盘消息

怎么将窗口最小化到托盘