我按tt.t的代码写了一个HOOK,用来在其它窗口(我在MYIE2下,和一个全屏游戏下进行测试的)
按热键后可以在当前窗口下弹出我建的窗口,但是当前窗口会假死,因为用的模式窗口,父窗口(也就是前面说的当前窗口)等待模式窗口退出,但模式窗口同时死掉,按任何键无效,鼠标点击无效....我听说把要弹出的窗口改为非模式窗口即可,可是我把
form1.ShowModal;
换为
form1.Show;
form1.update;
之后,还是不行,弹出窗口一闪即没....也试了SetParent,SetWindowPos,等等方法,都是不行
找遍了delphibbs,csdn,没找到办法,请大家帮忙了,,最好能给出源代码,谢谢!!!我要做的就是在一个程序中呼出一个窗口,并且可以操作这个窗口
而且要在全屏程序(比如游戏)中也可以呼出,同时不会切换出来(还是在全屏模式中,如金山游侠)5555
贴了90%的贴子,被一个非法操作就给over了。
那就再写一遍吧。
问题基本搞定,不一定要用dialgobox,关键是要现实的窗体的parnet必须要设成
游戏的窗体。这样就可以弹出自己的窗体,而游戏的窗体也不会最小化了。
我写了一个,w2k+delphi6+q3a测试通过。
代码比较乱,注意看注释。
热键是左边的win建加小键盘上得*建
ps,别忘了给分。
//--------------App part start----------------
//form上放两个button.
//Copyright by tt.t(ttui) @2k 3.1.19@bitunit test;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}
function sethook:bool;external 'ptdll.dll';
function endhook:bool;external 'ptdll.dll';procedure TForm1.Button1Click(Sender: TObject);
begin
//if
sethook;
// then showmessage('Hook Successful');
end;procedure TForm1.Button2Click(Sender: TObject);
begin
//if
endhook;
// then showmessage('Unhook Successful!!');
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
//endhook;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
//sethook;
end;end.
//--------------App part end------------------//--------------DLL part start------------------
//--------------library project------------------
library ptdll;uses
SysUtils,
Classes,
Windows,
Messages,
dll_vol in 'dll_vol.pas',
dia in 'dia.pas' {Form1};{$R *.RES}exports sethook,endhook;
begin
hNextHookProc := 0;
procSaveExit := ExitProc;
ExitProc := @HotKeyHookExit;
end.
//-------------------dll_vol unit-----------------------
unit dll_vol;interfaceuses Windows,Messages,Dialogs,Sysutils,dia;var
hNextHookProc: HHook;
procSaveExit: Pointer; function sethook:bool;export;
function hookproc(iCode:Integer;wParam: WPARAM;lParam: LPARAM): LRESULT; stdcall;
function endhook:bool;export;
procedure HotKeyHookExit;far;implementationfunction HookProc(iCode: integer; wParam: wParam; lParam: lParam): LResult; stdcall;
var
hwnd:dword;
AppRect:TRect;
title:pchar;
// dc:hdc;
begin
result:=0;
if iCode<0 then
begin
CallNextHookEx(hnexthookproc,iCode,wParam,lParam);
result:=0;
Exit;
end;
{
dc:=getdc(0);
textout(dc,20,20,pchar(inttohex(wparam,3)),3);
releasedc(0,dc);
}
if ((lParam and $80000000)=0) and
(GetKeyState(VK_LWIN)<0) and (wParam=$6a) then
begin
Messagebeep(0);
hwnd:=getforegroundwindow;
try
GetMem(title,255);
getwindowtext(hwnd,title,255);
if title<>'_Msg_Dx_' then
begin
try
form1:=TForm1.CreateParented(hwnd);
GetWindowRect(hwnd,AppRect);
form1.Left:=(AppRect.Right-AppRect.Left) div 2;
form1.Top:=(AppRect.Bottom-AppRect.Top) div 2;
form1.Caption:='_Msg_Dx_';
form1.ShowModal;
finally
form1.Free;
end;
end;
finally
FreeMem(title);
end;
result:=1;
end;
end;function sethook:bool;export;
begin
result:=false;
if hnexthookproc<>0 then exit;
hNextHookProc := SetWindowsHookEx(WH_KEYBOARD,hookproc,HInstance,0);
Result := hNextHookProc <> 0;
end;procedure hotkeyhookexit;
begin
if hNextHookProc <> 0 then endHook;
ExitProc := procSaveExit;
end;function endhook:bool;export;
begin
if hNextHookProc <> 0 then
begin
UnhookWindowshookEx(hNextHookProc); // 解除 Keyboard Hook
hNextHookProc := 0;
end;
Result := hNextHookProc = 0;
end;end.
//----------------dia unit-------------------
//注意!!form的borderstyle必须设成bsdialog!!
unit dia;interfaceuses
Windows, Messages, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}end.//--------------DLL part end------------------
按热键后可以在当前窗口下弹出我建的窗口,但是当前窗口会假死,因为用的模式窗口,父窗口(也就是前面说的当前窗口)等待模式窗口退出,但模式窗口同时死掉,按任何键无效,鼠标点击无效....我听说把要弹出的窗口改为非模式窗口即可,可是我把
form1.ShowModal;
换为
form1.Show;
form1.update;
之后,还是不行,弹出窗口一闪即没....也试了SetParent,SetWindowPos,等等方法,都是不行
找遍了delphibbs,csdn,没找到办法,请大家帮忙了,,最好能给出源代码,谢谢!!!我要做的就是在一个程序中呼出一个窗口,并且可以操作这个窗口
而且要在全屏程序(比如游戏)中也可以呼出,同时不会切换出来(还是在全屏模式中,如金山游侠)5555
贴了90%的贴子,被一个非法操作就给over了。
那就再写一遍吧。
问题基本搞定,不一定要用dialgobox,关键是要现实的窗体的parnet必须要设成
游戏的窗体。这样就可以弹出自己的窗体,而游戏的窗体也不会最小化了。
我写了一个,w2k+delphi6+q3a测试通过。
代码比较乱,注意看注释。
热键是左边的win建加小键盘上得*建
ps,别忘了给分。
//--------------App part start----------------
//form上放两个button.
//Copyright by tt.t(ttui) @2k 3.1.19@bitunit test;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}
function sethook:bool;external 'ptdll.dll';
function endhook:bool;external 'ptdll.dll';procedure TForm1.Button1Click(Sender: TObject);
begin
//if
sethook;
// then showmessage('Hook Successful');
end;procedure TForm1.Button2Click(Sender: TObject);
begin
//if
endhook;
// then showmessage('Unhook Successful!!');
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
//endhook;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
//sethook;
end;end.
//--------------App part end------------------//--------------DLL part start------------------
//--------------library project------------------
library ptdll;uses
SysUtils,
Classes,
Windows,
Messages,
dll_vol in 'dll_vol.pas',
dia in 'dia.pas' {Form1};{$R *.RES}exports sethook,endhook;
begin
hNextHookProc := 0;
procSaveExit := ExitProc;
ExitProc := @HotKeyHookExit;
end.
//-------------------dll_vol unit-----------------------
unit dll_vol;interfaceuses Windows,Messages,Dialogs,Sysutils,dia;var
hNextHookProc: HHook;
procSaveExit: Pointer; function sethook:bool;export;
function hookproc(iCode:Integer;wParam: WPARAM;lParam: LPARAM): LRESULT; stdcall;
function endhook:bool;export;
procedure HotKeyHookExit;far;implementationfunction HookProc(iCode: integer; wParam: wParam; lParam: lParam): LResult; stdcall;
var
hwnd:dword;
AppRect:TRect;
title:pchar;
// dc:hdc;
begin
result:=0;
if iCode<0 then
begin
CallNextHookEx(hnexthookproc,iCode,wParam,lParam);
result:=0;
Exit;
end;
{
dc:=getdc(0);
textout(dc,20,20,pchar(inttohex(wparam,3)),3);
releasedc(0,dc);
}
if ((lParam and $80000000)=0) and
(GetKeyState(VK_LWIN)<0) and (wParam=$6a) then
begin
Messagebeep(0);
hwnd:=getforegroundwindow;
try
GetMem(title,255);
getwindowtext(hwnd,title,255);
if title<>'_Msg_Dx_' then
begin
try
form1:=TForm1.CreateParented(hwnd);
GetWindowRect(hwnd,AppRect);
form1.Left:=(AppRect.Right-AppRect.Left) div 2;
form1.Top:=(AppRect.Bottom-AppRect.Top) div 2;
form1.Caption:='_Msg_Dx_';
form1.ShowModal;
finally
form1.Free;
end;
end;
finally
FreeMem(title);
end;
result:=1;
end;
end;function sethook:bool;export;
begin
result:=false;
if hnexthookproc<>0 then exit;
hNextHookProc := SetWindowsHookEx(WH_KEYBOARD,hookproc,HInstance,0);
Result := hNextHookProc <> 0;
end;procedure hotkeyhookexit;
begin
if hNextHookProc <> 0 then endHook;
ExitProc := procSaveExit;
end;function endhook:bool;export;
begin
if hNextHookProc <> 0 then
begin
UnhookWindowshookEx(hNextHookProc); // 解除 Keyboard Hook
hNextHookProc := 0;
end;
Result := hNextHookProc = 0;
end;end.
//----------------dia unit-------------------
//注意!!form的borderstyle必须设成bsdialog!!
unit dia;interfaceuses
Windows, Messages, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}end.//--------------DLL part end------------------
解决方案 »
- SVN问题
- 如何实现用delphi实现压缩access数据库
- MonthCalendar控件中得“星期一”,如何显示为“一”???
- 一个很急的问题
- 请问大家一个简单的白痴的问题
- 如何把一个2进制的文件内容读入一个数组中(请给出例子代码)谢谢!!!
- 我在做一个开票的程序,想随机产生号,例如2002年3月27号第一张单子,他的号码为20020327001,第二张单子的号码则为20020327002,怎么实
- 我现在37岁,想知道这里的人都多大?我在这里算不算是老翁啊?
- 有关setupbuilder1.5sc
- 小问题,在Delphi中怎样用winAPI函数SHELLEXECUTE调用文件
- 文件的关联
- 口令加密问题
发个EXE我试下OK?
[email protected]
Use the Run|Parameters...dialog box.我也把dig的form的borderstyle设成bsdialog能否帮我解决一下????
TForm1 = class(TForm)
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
aatom:atom;
procedure hotkey(var msg:tmessage);message wm_hotkey;
public
{ Public declarations }
end; var
Form1: TForm1;
h:HWND;
implementation uses Unit2; {$R *.dfm}
procedure TForm1.hotkey(var msg:tmessage);
begin
if (msg.LParamHi=VK_MULTIPLY) then
begin
h:=GetForegroundWindow;
if h=0 then Exit;
freeAndNil(Form2);
Form2:= TForm2.CreateParented(h);
Form2.show;
end;
end; procedure TForm1.FormDestroy(Sender: TObject);
begin
globalDeleteatom(aatom);
end; procedure TForm1.FormCreate(Sender: TObject);
begin
aatom:=globaladdatom('hot key');
RegisterHotKey(handle,aatom,0,vk_MULTIPLY);
end;
代码下载地址是:ftp://new:[email protected]/datanew/2003120914451810182.rar 用小键盘星号呼出试试?不过窗体重绘没有写成DirectX 窗体,只是一个标准窗体,我试过在魔兽3中呼出,窗体经常被屏幕刷新覆盖,但确实不影响游戏
SetForegroundWindow(MainForm.Handle);
MainForm.BringToFront;