Delphi 实现键盘模拟、锁定键盘,锁定鼠标等操作

Delphi 模拟按键的方法

SendMessageA

说明: 调用一个窗口的窗口函数,将一条消息发给那个窗口。除非消息处理完毕,否则该函数不会返回SendMessage所包含4个参数:

  1. hwnd 32位的窗口句柄窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可视对象的句柄

  2. wMsg 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量

  3. wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄

  4. lParam 通常是一个指向内存中数据的指针。由于WParm、lParam和Pointer都是32位的,因此,它们之间可以相互转换

wMsg函数

★WM_Create 创建一个窗口

★WM_DESTROY 当一个窗口被破坏时发送

★WM_MOVE 移动一个窗口

★WM_SIZE 改变一个窗口的大小

★WM_ACTIVATE 一个窗口被激活或失去激活状态

★WM_SETFOCUS 一个窗口获得焦点

★WM_KILLFOCUS 一个窗口失去焦点

★WM_ENABLE 一个窗口改变成Enable状态

★WM_SETREDRAW 设置窗口是否能重画

★WM_SETTEXT 应用程序发送此消息来设置一个窗口的文本

★WM_GETTEXT 应用程序发送此消息来复制对应窗口的文本到缓冲区

★WM_GETTEXTLENGTH 得到与一个窗口有关的文本的长度(不包含空字符)

★WM_PAINT 要求一个窗口重画自己

★WM_CLOSE 当一个窗口或应用程序要关闭时发送一个信号

★WM_QUERYENDSESSION 用户选择结束对话框或程序自己调用ExitWindows函数

★WM_QUIT 用来结束程序运行

★WM_QUERYOPEN 用户窗口恢复以前的大小位置时,把此消息发送给某个图标

★WM_ERASEBKGND 当窗口背景必须被擦除时(例在窗口改变大小时)

★WM_SYSCOLORCHANGE 当系统颜色改变时,发送此消息给所有顶级窗口

★WM_QUERYENDSESSION 消息后,此消息发送给应用程序,通知它对话是否结束

★WM_SHOWWINDOW 当隐藏或显示窗口是发送此消息给这个窗口

★WM_ACTIVATEAPP 发此消息给应用程序哪个窗口是激活的,哪个是非激活的

★WM_FONTCHANGE 当系统的字体资源库变化时发送此消息给所有顶级窗口

★WM_TIMECHANGE 当系统的时间变化时发送此消息给所有顶级窗口

★WM_CANCELMODE 发送此消息来取消某种正在进行的摸态(操作)

★WM_SETCURSOR 如果鼠标引起光标在某个窗口中移动

★WM_ENDSESSION 当系统进程发出且鼠标输入没有被捕获时,就发消息给某个窗口

★WM_MOUSEACTIVATE 当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口

★WM_CHILDACTIVATE 送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小

★WM_QUEUESYNC 此消息由基于计算机的训练程序发送,通过 WH_JOURNALPALYBACK的hook程序分离出用户输入消息

★WM_GETMINMAXINFO 此消息发送给窗口当它将要改变大小或位置

★WM_PAINTICON 发送给最小化窗口当它图标将要被重画

★WM_ICONERASEBKGND 此消息发送给某个最小化窗口,仅当它在画图标前它的背景必须被重画

★WM_NEXTDLGCT★发送此消息给一个对话框程序去更改焦点位置

★WM_SPOOLERSTATUS 每当打印管理列队增加或减少一条作业时发出此消息

★WM_DRAWITEM 当button,combobox,listbox,menu的可视外观改变时发送

★WM_MEASUREITEM 当button, combobox, listbox, listview control, or menuitem 被创建时

★WM_VKEYTOITEM 此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息

★WM_CHARTOITEM 此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息

★WM_SETFONT 当绘制文本时程序发送此消息得到控件要用的颜色

★WM_GETFONT 应用程序发送此消息得到当前控件绘制文本的字体

★WM_SETHOTKEY 应用程序发送此消息让一个窗口与一个热键相关连

★WM_GETHOTKEY 应用程序发送此消息来判断热键与某个窗口是否有关联

★WM_QUERYDRAGICON 此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序能返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标

★WM_COMPAREITEM 发送此消息来判定combobox或listbox新增加的项的相对位置

★WM_COMPACTING 显示内存已经很少了

★WM_WINDOWPOSCHANGING 发送此消息给那个窗口的大小和位置将要被改变时,来调用setwindowpos函数或其它窗口管理函数

★WM_WINDOWPOSCHANGED 发送此消息给那个窗口的大小和位置已经被改变时,来调用setwindowpos函数或其它窗口管理函数

★WM_POWER 当系统将要进入暂停状态时发送此消息

★WM_COPYDATA 当一个应用程序传递数据给另一个应用程序时发送此消息

★WM_CANCELJOURNA 当某个用户取消程序日志激活状态,提交此消息给程序

★WM_NOTIFY 当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口

★WM_INPUTLANGCHANGEREQUEST 当用户选择某种输入语言,或输入语言的热键改变

★WM_INPUTLANGCHANGE 当平台现场已经被改变后发送此消息给受影响的最顶级窗口

★WM_TCARD 当程序已经初始化windows帮助例程时发送此消息给应用程序

★WM_HELP 此消息显示用户按下了F1,如果某个菜单是激活的,就发送此消息个此窗口关联的菜单,否则就发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口

★WM_USERCHANGED 当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体设置信息,在用户更新设置时系统马上发送此消息

★WM_NOTIFYFORMAT 公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICODE结构
SendMessage(TreeView.Handle,TVM_SETBKCOLOR,0,RGB(255,0,0)); 设置TV背景颜色

SendMessage(Button.Handle,WM_LBUTTONDOWN,0,0);  鼠标左键按下

SendMessage(Button.Handle,WM_LBUTTONUP,0,0);   鼠标左键抬起

SendMessage(Edit.Handle,WM_SETTEXT,255,Integer(PChar('abc'))); 传递文本

SendMessage(Edit.Handle,WM_Char,Wparam('Q'),2);  传递字符

SendMessage(Button.Handle,BM_SETSTYLE,BS_RADIOBUTTON,1);  改变Button风格

SendMessage(ComboBox.Handle,CB_SETDropPEDWIDTH,300,0);  改变CBDownWidth

WM_CUT、WM_COPY和WM_PASTE  剪切,复制,粘帖

实现任意组合键

keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), 0, 0);

keybd_event(ord('V'), MapVirtualKey(ord('V'), 0), 0, 0);

keybd_event(ord('V'), MapVirtualKey(ord('V'), 0), KEYEVENTF_KEYUP, 0);

keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), KEYEVENTF_KEYUP, 0);

Delphi 模拟按键方法(经典简单)

内容:模拟win键:

keybd_event(VK_LWIN, 0, 0, 0);

keybd_event(Byte('R'), 0, 0, 0);

keybd_event(Byte('R'), 0, KEYEVENTF_KEYUP, 0);

keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);

键盘常用代码一览表:

vbKeyLButton 0x1 鼠标左键

vbKeyRButton 0x2 鼠标右键

vbKeyCancel 0x3 CANCEL键

vbKeyMButton 0x4 鼠标中键

vbKeyBack 0x8 退格键

vbKeyTab 0x9 TAB 键

vbKeyClear 0xC CLEAR健

vbKeyReturn 0xD 回车键

vbKeyShift 0x10 SHIFT 键

vbKeyControl 0x11 CTRL 键

vbKeyMenu 0x12 MENU 键

vbKeyPause 0x13 PAUSE 键

vbKeyCapital 0x14 APS LOCK 键

vbKeyEscape 0x1B ESC 键

vbKeySpace 0x20 空格键

vbKeyPageUp 0x21 Page Up 键

vbKeyPageDown 0x22 Page Down 键

vbKeyEnd 0x23 END 键

vbKeyHome 0x24 HOME 键

vbKeyLeft 0x25 光标左键

vbKeyUp 0x26 光标上键

vbKeyRight 0x27 光标右键

vbKeyDown 0x28 光标下键

vbKeySelect 0x29 SELECT 键

vbKeyPrint 0x2A Print Screen 键

vbKeyExecute 0x2B EXECUTE 键

vbKeySnapshot 0x2C SnapShot 键

vbKeyInsert 0x2D INSERT 键

vbKeyDelete 0x2E DELETE 键

vbKeyHelp 0x2F HELP 键

vbKeyNumlock 0x90 NUM LOCK 键

vbKeyA 65 字母 A 键

vbKeyB 66 字母 B 键

vbKeyC 67 字母 C 键

vbKeyD 68 字母 D 键

vbKeyE 69 字母 E 键

vbKeyF 70 字母 F 键

vbKeyG 71 字母 G 键

vbKeyH 72 字母 H 键

vbKeyI 73 字母 I 键

vbKeyJ 74 字母 J 键

vbKeyK 75 字母 K 键

vbKeyL 76 字母 L 键

vbKeyM 77 字母 M 键

vbKeyN 78 字母 N 键

vbKeyO 79 字母 O 键

vbKeyP 80 字母 P 键

vbKeyQ 81 字母 Q 键

vbKeyR 82 字母 R 键

vbKeyS 83 字母 S 键

vbKeyT 84 字母 T 键

vbKeyU 85 字母 U 键

vbKeyV 86 字母 V 键

vbKeyW 87 字母 W 键

vbKeyX 88 字母 X 键

vbKeyY 89 字母 Y 键

vbKeyZ 90 字母 Z 键

vbKey0 48 数字 0 键

vbKey1 49 数字 1 键

vbKey250数字 2 键

vbKey3 51 数字 3 键

vbKey4 52 数字 4 键

vbKey553 数字 5 键

vbKey6 54 数字 6 键

vbKey7 55 数字 7 键

vbKey8 56 数字 8 键

vbKey9 57 数字 9 键

vbKeyF1 0x70 F1 功能键

vbKeyF2 0x71 F2 功能键

vbKeyF3 0x72 F3 功能键

vbKeyF4 0x73 F4 功能键

vbKeyF5 0x74 F5 功能键

vbKeyF6 0x75 F6 功能键

vbKeyF7 0x76 F7 功能键

vbKeyF8 0x77 F8 功能键

vbKeyF9 0x78 F9 功能键

vbKeyF10 0x79 F10 功能键

vbKeyF11 0x7A F11 功能键

vbKeyF12 0x7B F12 功能键

vbKeyF13 0x7C F13 功能键

vbKeyF14 0x7D F14 功能键

vbKeyF15 0x7E F15 功能键

vbKeyF16 0x7F F16 功能键

vbKeyNumpad0 0x60 小键盘 0 键

vbKeyNumpad1 0x61 小键盘 1 键

vbKeyNumpad3 0x63 小键盘 3 键

vbKeyNumpad4 0x64 小键盘 4 键

vbKeyNumpad5 0x65 小键盘 5 键

vbKeyNumpad6 0x66 小键盘 6 键

vbKeyNumpad7 0x67 小键盘 7 键

vbKeyNumpad8 0x68 小键盘 8 键

vbKeyNumpad9 0x69 小键盘 9 键

vbKeyMultiply 0x6A 小键盘 * 键

vbKeyAdd 0x6B 小键盘 + 键

vbKeySeparator 0x6C 小键盘回车键

vbKeySubtract 0x6D 小键盘 - 键

vbKeyDecimal 0x6E 小键盘 . 键

vbKeyDivide 0x6F 小键盘 / 键

Delphi 键盘码表

VK_LBUTTON = 1;

VK_RBUTTON = 2;

VK_CANCEL = 3;

VK_MBUTTON = 4; { NOT contiguous with L & RBUTTON }

VK_BACK = 8;

VK_TAB = 9;

VK_CLEAR = 12;

VK_RETURN = 13;

VK_SHIFT = $10;

VK_CONTROL = 17;

VK_MENU = 18;

VK_PAUSE = 19;

VK_CAPITAL = 20;

VK_KANA = 21;

VK_HANGUL = 21;

VK_JUNJA = 23;

VK_FINAL = 24;

VK_HANJA = 25;

VK_KANJI = 25;

VK_CONVERT = 28;

VK_NONCONVERT = 29;

VK_ACCEPT = 30;

VK_MODECHANGE = 31;

VK_ESCAPE = 27;

VK_SPACE = $20;

VK_PRIOR = 33;

VK_NEXT = 34;

VK_END = 35;

VK_HOME = 36;

VK_LEFT = 37;

VK_UP = 38;

VK_RIGHT = 39;

VK_DOWN = 40;

VK_SELECT = 41;

VK_PRINT = 42;

VK_EXECUTE = 43;

VK_SNAPSHOT = 44;

VK_INSERT = 45;

VK_DELETE = 46;

VK_HELP = 47;

{ VK_0 thru VK_9 are the same as ASCII '0' thru '9' ($30 - $39) }

{ VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' ($41 - $5A) }

VK_LWIN = 91;

VK_RWIN = 92;

VK_APPS = 93;

VK_NUMPAD0 = 96;

VK_NUMPAD1 = 97;

VK_NUMPAD2 = 98;

VK_NUMPAD3 = 99;

VK_NUMPAD4 = 100;

VK_NUMPAD5 = 101;

VK_NUMPAD6 = 102;

VK_NUMPAD7 = 103;

VK_NUMPAD8 = 104; VK_NUMPAD9 = 105;

VK_MULTIPLY = 106;

VK_ADD = 107;

VK_SEPARATOR = 108;

VK_SUBTRACT = 109;

VK_DECIMAL = 110;

VK_DIVIDE = 111;

VK_F1 = 112;

VK_F2 = 113;

VK_F3 = 114;

VK_F4 = 115;

VK_F5 = 116;

VK_F6 = 117;

VK_F7 = 118;

VK_F8 = 119;

VK_F9 = 120;

VK_F10 = 121;

VK_F11 = 122;

VK_F12 = 123;

VK_F13 = 124;

VK_F14 = 125;

VK_F15 = 126;

VK_F16 = 127;

VK_F17 = 128;

VK_F18 = 129;

VK_F19 = 130;

VK_F20 = 131;

VK_F21 = 132;

VK_F22 = 133;

VK_F23 = 134;

VK_F24 = 135;

VK_NUMLOCK = 144;

VK_SCROLL = 145;

{ VK_L & VK_R - left and right Alt, Ctrl and Shift virtual keys.

Used only as parameters to GetAsyncKeyState() and GetKeyState().

No other API or message will distinguish left and right keys in this way. }

VK_LSHIFT = 160;

VK_RSHIFT = 161;

VK_LCONTROL = 162;

VK_RCONTROL = 163;

VK_LMENU = 164;

VK_RMENU = 165;

VK_PROCESSKEY = 229;

VK_ATTN = 246;

VK_CRSEL = 247;

VK_EXSEL = 248;

VK_EREOF = 249;

VK_PLAY = 250;

VK_ZOOM = 251;

VK_NONAME = 252;

VK_PA1 = 253;

VK_OEM_CLEAR = 254;

delphi 模似键盘输入又一方法

Delphi 复制代码
EnumChildWindows(Hwindow,@LoginEnumWindowsProc,LongInt(self)); 

for i:=0 to chklst_Uid.Count-1 do
begin
if chklst_Uid.Checked then
begin
SplitString(Trim(chklst_Uid.Items.Strings),'-',a,b);
UidLogin:=Trim(a);
UidPassword:=Trim(b);
SendMessage(HLoginNum, WM_SETTEXT, 180, Integer(PChar(UidLogin)));
for j:=1 to 6 do
begin
mychar:=MidStr(UidPassword,j,1);
SendMessage(Hpass,WM_CHAR,Ord(mychar[1]),0);
end;

chklst_Uid.Checked:=False;
lbl_LoginUid.Caption:=UidPassword;
Break;
end;
end;

delphi 全局钩子锁定键盘

Delphi 复制代码
//可以锁所有键盘按键和任意组合键,但对于ALT+TAB,CTRL+ALT+DEL无效!

//DLL代码如下

Library KillKB;

uses Wintypes, WinProcs;

Var
oldHook: HHook;

function KBHooKProc(code: Integer; wParam: WPARAM;lParam: LPARAM):LRESULT;stdcall; export;
Begin
If code < 0 Then
Result := CallNextHookEx( oldHook, code, wparam, lparam )
Else
Result := 1;
end;

function DisableKeyboard: Boolean; export;
Begin
oldHook := SetWindowsHookEx(WH_KEYBOARD,KBHooKProc,HInstance, 0 );
DisableKeyboard := oldHook <> 0;
End;

procedure EnableKeyboard; export;
Begin
If oldHook <> 0 Then Begin
UnhookWindowshookEx( oldHook );
oldHook := 0;
End; 
End;

exports
DisableKeyboard,
EnableKeyboard;

Begin
oldHook := 0;
End. 

Delphi 全局钩子锁定鼠标

Delphi 复制代码
//DLL代码如下:

library MouseHOOK;

uses
Windows, Messages;

var
hNextHookProc: HHook;

function MouseHookProc(iCode: Integer;wParam: WPARAM;lParam: LPARAM): LRESULT; stdcall; export;
begin
If iCode < 0 Then
begin
if wParam = WM_LBUTTONDOWN then
begin
Result := CallNextHookEx(hNextHookProc, iCode, wParam, lParam);
end
else
Result:=1;
end;
end;


function DisableMouse: BOOL; export;
begin
Result := False;
if hNextHookProc <> 0 then Exit;
hNextHookProc := SetWindowsHookEx(WH_MOUSE,MouseHookProc,HInstance,0);
Result:=False;
end;


function EnableMouse: BOOL; export;
begin
if hNextHookProc <> 0 then
begin
UnhookWindowshookEx(hNextHookProc);
hNextHookProc := 0;
end;
Result := hNextHookProc = 0;
end;

exports
EnableMouse,
DisableMouse;

end.
 

delphi 如何取得键盘每个键

Delphi 复制代码
uses 
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dia
logs, 
StdCtrls; 

type 
TForm1 = class(TForm) 
Label1: TLabel; 
private 
{ Private declarations } 
protected procedure mykeydown(var msg:Twmkeydown);message wm_keydo
wn; 
public 
{ Public declarations } 
end; 

var 
Form1: TForm1; 

implementation 

{$R *.DFM} 
procedure tform1.mykeydown (var msg:Twmkeydown); 
begin 
    label1.Caption:=inttostr(msg.charcode); 
end; 
end.

delphi 鼠标跟随代码

Delphi 复制代码
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls;

type
TForm1 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
px,py : Integer;
Pscreen : hdc;
can : tcanvas;
p : TPoint;
begin
Pscreen:=getdc(0);
can:=tcanvas.Create;
can.Handle:=Pscreen;
can.Brush.style:=bsclear;
can.Pen.color:=clwindow;
can.Pen.Width := 8;
GetCursorPos(P); //得到鼠标坐标
px := p.X;
py := p.Y;
can.Ellipse(px-3,py-3,px+3,py+3);
can.Free;
releasedc(0,Pscreen);
end;

delphi 向其他程序发送模拟按键

向其他程序发送模拟按键:

1、用keybd_event:

var

h : THandle;

begin

h := FindWindow('TFitForm', '1stOpt - [Untitled1]');

SetForegroundWindow(h);

keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);

keybd_event(VK_F9, MapVirtualKey(VK_F9, 0), 0, 0);

keybd_event(VK_F9, MapVirtualKey(VK_F9, 0), KEYEVENTF_KEYUP, 0);

keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);

end;

选找到目标程序的句柄h,在应用Keybd_event之前必须先把目标程序设为当前活动窗口。(如果不想看见的话,把目标程序的位置用SetWindowLong设置在屏幕之外.)

2、用SendMessage、PostMessage:

不需目标置为最前。

SendMessage(h,WM_KEYDOWN,VK_F9,0);

PostMessage(h,WM_KEYDOWN,VK_F9,0);

发送组合键:PostMessage(h,WM_SYSKEYDOWN,VK_F9,$10000000);//试验不成功

Ctrl : $10000000;

Shift: $08000000;

Alt: $20000000

如打开菜单ALT-F,则要WM_SYSKEYDOWM,:PostMessage(h,WM_SYSKEYDOWN,70,$20000000);才行。(//试验成功)

3、CTL键组合发送不成功。

4、向后台应用程序发送按键总结:

4.1 单个按健:PostMessage(h,WM_KEYDOWN,VK_F9,0);

4.2ALT+按键:PostMessage(h,WM_SYSKEYDOWN,70,$20000000);

4.3CTL+按键:暂时模仿如下,基本可行。但不用sleep(10),有时行,有时不行。换用SendMessage却不行,WHY?

if hwnd<>0 then

begin

keybd_event(VK_CONTROL,0,0,0);

PostMessage(hwnd,WM_KEYDOWN,VK_F9,0);

PostMessage(hwnd,WM_KEYUP,VK_F9,0);

sleep(10);

keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);

end;

说明:

键盘事件消息可以分为"击键"和"字符"两类。对于可以显示字符的击键组合,Windows不仅向程序发送击键消息,还发送字符消息。有些键不产生字符,这些键包括shift键、Fn功能键、光标移动键和特殊字符如Insert和Delete。

击键消息包括WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN、WM_SYSKEYUP四种类型。WM_KEYDOWN和WM_KEYUP消息通常是在按下或释放不带Alt键的键时产生;WM_SYSKEYDOWN和WM_SYSKEYUP消息通常由与Alt组合的击键产生,这些键激活程序菜单或系统菜单上的选项,或切换活动窗口,也可以用作系统菜单加速键。由于Windows处理所有Alt键的功能,应用程序无需捕获这些消息。对于4类击键消息,wParam是虚拟键代码,代表按下或释放的键,而lParam包含击键的其他数据。如果按住一个键不放使得自动重复功能生效,那么该键最后被释放时,Windows会给窗口过程发送一系列的WM_KEYDOWN(或WM_SYSKEYDWON)消息和一个WM_KEYUP(或WM_SYSKEYUP)消息。