如何在自己程序里设计热键,需要在别人游戏里得到响应(300分)

  • 主题发起人 火龙真人
  • 开始时间

火龙真人

Unregistered / Unconfirmed
GUEST, unregistred user!
怎么办,不是一般的热键啊,窗体程序里会响应
可我在有 DIRECTX的全屏游戏就得不到响应,
如之奈何?
 
转贴:
全局热键
 吴中卫  通常在自己的程序里定义热键,只能在自己的应用窗口范围内使用,未免使用起来受到一定的限制。
如果能在自己的应用程序里定义能被所有窗口访问的热键,应该是比较具有现实意义的。要定义一个全局热键,通常有三个步骤:
  1。定义 Windows 的消息 WM_HOTKEY 的 HOOK 链,即 procedure myshortcut(var message: TMessage); message WM_HOTKEY;  
 2。向 Windows 加入一个全局原子 hotkey : GlobalAddAtom(’hotkey’), 并保留其句柄   
3。向 Windows 登记热键链: RegisterHotKey( 应用句柄,全局原子句柄, mod_control ,88 ); 其中,RegisterHotKey 函数原形如下
BOOL RegisterHotKey(
            HWND hWnd, // 连接热键的窗口句柄
int id, // 全局原子句柄
UINT fsModifiers,      // 热键修饰标志
UINT vk // 虚拟键盘码 ); 
  这里,fsModifiers 是指虚拟键盘码 vk 结合何种键一起生成 WM_HOTKEY 的消息,它是下列三值的组合:   
  MOD_ALT      // ALT 键必须按下
MOD_CONTROL  // CTRL 键必须按下
MOD_SHIFT    // SHIFT 键必须按下
  有了这些准备,你就可以定义自己喜欢的方式了。
下面是一个范例,当 CTRL + Q 在任何时候被按下时,都会打出 “你好,Crtl + Q 被按下” 的信息。
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);

  protected
    procedure myshortcut(var message: TMessage); message WM_HOTKEY;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  id:Integer;

implementation

{$R *.DFM}

procedure TForm1.myshortcut(var message: TMessage);
begin
  ShowMessage(’你好,Crtl + Q 被按下’);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
id:=GlobalAddAtom(’hotkey’);
  RegisterHotKey(handle,id,mod_control,88);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(handle,id); //别忘了在退出时取消定义
end;
 
很多游戏会屏蔽系统热键哦 最好用键盘钩子来做
 
我已经说过不是一般的热键了啊,在游戏里不管用的.
我需要象FPE那样能在游戏里响应.
 
要注册你的热键
 
試一下
定一過程
procedure WMHotKey(var Msg: TMessage); message WM_HOTKEY;
//--registry system hotkey
procedure TForm1.FormCreate(Sender: TObject);
begin
egisterHotkey(form1.Handle,$DDDDD,0, VK_F10);
end;

procedure Tform1.WMHotKey(var Msg: TMessage);
begin
if Msg.WParam=$DDDDD then
begin
showmessage('You press F10 key');
end;
end;

 
你也看见上面也用这办法我都说不行了
这么大的论坛,就一个热键问题都解决不好啊
急死人。我只会给解决问题的人分的
 
這話我怎么又那么不愛聽呢﹖怎么那么別扭呢﹖說得大家都來騙分一樣的﹖
"这么大的论坛,就一个热键问题都解决不好啊" 真不爽﹗
 
"这么大的论坛,就一个热键问题都解决不好啊"
这是实话,你不爱听实话啊?
 
游戏里面不能用这些方法的,我试过无效,可以用
GetAsyncKeyState函数,在一个Timer里面调用,
example:
var KeyState : SHORT;
// Detect Keypress
KeyState := GetAsyncKeyState(VK_F12);
if KeyState <> 0 then begin
end; // Process
我原来写过一个StarCraft作弊器,工作起来很正常,你试一下
 
一个论坛里面大家和和气气谈论问题多好,你们吵什么呀,又不是很大的事情...[:(]
 
呵呵呵呵,人急啊,一急就。。。。
吵一下也好,才叫火暴的论坛
 
是啊只有TIMER里的东西才会响应啊,但是如何抓图了
我把代码放进去了还是不行,用的 就是DDRAW啊
 
OpenGL抓图简单,DDRAW的不知道,有答案的话可以公布吗?
 
procedure TForm1.GetScreenshot;
var
ADIB:TDIB;
ScreenshotName:String;
begin
ScreenshotName:='screenshot.bmp';
ADIB:=TDIB.Create;
DXDraw.Surface.AssignTo(ADIB);
ADIB.SaveToFile(ScreenshotName);
FreeAndNil(ADIB);
end;
这份用DELPHIX的截图只能对自己程序抓,对别人游戏就不行啊。
 
DXDraw好像是DelphiX中的一个控件吧?是的话肯定只能抓到自己的啊...
别人的游戏的Surface又不是这个控件的
 
老兄玩游戏真有瘾,都开始改游戏了。

procedure TForm1.GetScreenshot;
var
ADIB:TDIB;
ScreenshotName:String;
begin
ScreenshotName:='screenshot.bmp';
ADIB:=TDIB.Create;
DXDraw.Surface.AssignTo(ADIB);
ADIB.SaveToFile(ScreenshotName);
FreeAndNil(ADIB);
end;
哎,Delphi抓图太简单了,对比强烈阿。
 
to wukw
看看你写的,我上面都写了,已经说过不行了啊
DXDraw.Surface是你自己程序里的,不是别人游戏里的
怎么行
 
只有用钩子
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
715
import
I
D
回复
0
查看
1K
DelphiTeacher的专栏
D
顶部