最近我下了个FAKEY的
虚拟键盘模拟按键的代码,他里面生成了一个SENDKEY.dll,因为我不懂VC,我想用 DELPHI调用SENDKEY.DLL里面的4函数,(vksendkey,VKSendKeyEx,VKOpenVirtualKey,VKCloseVirtualKey)
sendkey.dll 里面的函数 声明如下:
extern "C" SENDKEY_API int VKSendKey(PVK_SENDKEY key)
{
HANDLE file = CreateFile(DEVICE_NAME,GENERIC_WRITE|GENERIC_READ,0,0,OPEN_EXISTING,0,0);
if(file == INVALID_HANDLE_VALUE)
{
return false;
}
DWORD BytesRet = 0;
int ret = DeviceIoControl(file,IOCTL_SENDKEY,key,sizeof(VK_SENDKEY),0,0,&BytesRet,0);
if(ret == 0)
{
return false;
}
CloseHandle(file);
return true;
}
extern "C" SENDKEY_API HANDLE VKOpenVirtualKey()
{
return CreateFile(DEVICE_NAME,GENERIC_WRITE|GENERIC_READ,0,0,OPEN_EXISTING,0,0);
}
extern "C" SENDKEY_API int VKCloseVirtualKey(HANDLE VKHandle)
{
return CloseHandle(VKHandle);
}
extern "C" SENDKEY_API int VKSendKeyEx(HANDLE VKHandle,PVK_SENDKEY key)
{
DWORD BytesRet = 0;
return DeviceIoControl(VKHandle,IOCTL_SENDKEY,key,sizeof(VK_SENDKEY),0,0,&BytesRet,0);
}
//我在DELPHI里面的声明如下:
function VKSendKey(key:ptypedef):pointer;external 'SendKey.dll' name'VKSendKey';
//发送KEY
function VKSendKeyEX(phandle:cardinal;senkey:ptypedef):integer;stdcall;external 'SendKey.dll' name'VKSendKeyEx';
//发送key
function VKOpenVirtualKey:cardinal;stdcall;external 'SendKey.dll' name'VKOpenVirtualKey';
//打开HKEY
function VKCloseVirtualKey:cardinal;stdcall;external 'SendKey.dll' name'VKCloseVirtualKey';
//关闭HKEY
,其实上面都不是重点,关键是 VKSendKey(key:ptypedef) 那个指针KEY这个问题过不去
C里面的指针声明如下:
typedef struct
{
int Count;
struct
{
int Press;
int Code;
}Keys[6];
}VK_SENDKEY,*PVK_SENDKEY;
我用DELPHI定义指针如下:
typrec=record
press:integer;
code:integer;
end;
typedef=record
count:integer;
keys:array[0..5] of typrec;
end;
ptypedef=^typedef;
使用我的定义的结构
procedure TForm1.Button1Click(Sender: TObject);
var
e,e1: ptypedef;
begin
E.count := 1;
E.keys[0].press :=1;
E.keys[0].code:=$24;
getMeM(e,30); //这里给指针申请内存空间
vksendkey(@e); //用VKSENDKEYEX也可以
//vksendkeyex(hkey,@E);
end;
以下附上我的DELPHI源代码
请各位大牛帮我看看要怎么弄
unit sendkey;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
typrec=record
press:integer;
code:integer;
end;
typedef=record
count:integer;
keys:array[0..5] of typrec;
end;
ptypedef=^typedef;
var
Form1: TForm1;
hkey:cardinal;
//keys:array[1..6] of first; //定义数组
data:ptypedef;
implementation
{$R *.dfm}
//这里定义应用导入DLL的一些函数
function VKSendKey(key:ptypedef):pointer;external 'SendKey.dll' name'VKSendKey';
//发送KEY
function VKSendKeyEX(phandle:cardinal;senkey:ptypedef):integer;stdcall;external 'SendKey.dll' name'VKSendKeyEx';
//发送key
function VKOpenVirtualKey:cardinal;stdcall;external 'SendKey.dll' name'VKOpenVirtualKey';
//打开HKEY
function VKCloseVirtualKey:cardinal;stdcall;external 'SendKey.dll' name'VKCloseVirtualKey';
//关闭HKEY
procedure TForm1.Button1Click(Sender: TObject);
var
e,e1: ptypedef;
begin
E.count := 1;
E.keys[0].press :=1;
E.keys[0].code:=$24;
getMeM(e,30); //这里给指针申请内存空间
vksendkeyex(hkey,@E);
// e1:=e; //保留原来指针的位置
//Dispose(E);
//FillChar(data,SizeOf(data),#0);
//FillMemory(@data,SizeOf(data),0);
//相当于VC++ MEMSET
edit2.SetFocus; //先设置EDIT1为焦点,这样方便观察是否能输入
edit2.Text:='就绪';
vksendkeyex(hkey,@E);
//vksendkey(@E);
//vksendkey(E);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
hkey:=VKOpenVirtualKey;
edit1.Text:=inttostr(hkey);
end;
end.
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法