关于键盘自动控制 |
尚未結案
|
linruiq
一般會員 ![]() ![]() 發表:1 回覆:6 積分:1 註冊:2005-09-14 發送簡訊給我 |
程序要求:1.运行程序,在其它程序(如word)中,按一快捷键,连续打出如
ZXZXZXZXZXZXZXZXZX(即轮流按下键盘"Z"键和"X"键).
2.按下"Z"键"X"键的间隔时间可以调整(可快可慢).
自己做了一个小试验:程序如下: system页中的选择Timer组件
procedure TForm1.Timer1Timer(Sender: TObject);
var
KeyStates:TKeyboardState;
begin
GetKeyboardState(KeyStates);
if (KeyStates[VK_NUMLOCK])=0 then
begin
KeyStates[VK_NUMLOCK]:=1; //1时表示状态键处于ON状态
setKeyboardState(keyStates);
end;
end;
运行结果:虚拟内存中的numlock键被处于ON状态,但是键盘无反应,即numlock灯不亮.
如何控制键盘的自动操作???请教求教................
|
Fishman
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
Hi linruiq,
procedure TouchKey(wVk:word;wScan:word;dwFlags,dwExtraInfo:dword) ; var In1 : TInput; begin In1.Itype := INPUT_KEYBOARD; In1.ki.wVk := wVk; In1.ki.wScan := wScan; In1.ki.dwFlags := dwFlags; In1.ki.time := 0; In1.ki.dwExtraInfo := dwExtraInfo; SendInput(1, In1, SizeOf(TINPUT)); end ; procedure TForm1.Button1Click(Sender: TObject); var I : Integer; S : String; A : Array[0..1000] OF Char; begin S := 'ZXZXZXZXZXZXZXZXZX'; StrCopy(A,PChar(S)); Edit1.SetFocus; for I := 0 to Length(s) - 1 do begin TouchKey(Ord(S[I]),MapVirtualKey(Ord(S[I]),0),0,0); TouchKey(Ord(S[I]),MapVirtualKey(Ord(S[I]),0),KEYEVENTF_KEYUP,0); end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin TouchKey(VK_NUMLOCK,MapVirtualKey(VK_NUMLOCK,0),0,0); TouchKey(VK_NUMLOCK,MapVirtualKey(VK_NUMLOCK,0),KEYEVENTF_KEYUP,0); end;
------
Fishman |
linruiq
一般會員 ![]() ![]() 發表:1 回覆:6 積分:1 註冊:2005-09-14 發送簡訊給我 |
|
Fishman
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
Hi linruiq,
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Timer1: TTimer; procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private declarations } P,I : Integer; S : String; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TouchKey(wVk:word;wScan:word;dwFlags,dwExtraInfo:dword) ; var In1 : TInput; begin In1.Itype := INPUT_KEYBOARD; In1.ki.wVk := wVk; In1.ki.wScan := wScan; In1.ki.dwFlags := dwFlags; In1.ki.time := 0; In1.ki.dwExtraInfo := dwExtraInfo; SendInput(1, In1, SizeOf(TINPUT)); end ; procedure TForm1.FormCreate(Sender: TObject); begin Form1.KeyPreview := True; S := 'ZX'; // the key which will be pressed by sequence P := 0; // currnt position for S I := 500; // Interval for Timer1,0.5 second end; procedure TForm1.Timer1Timer(Sender: TObject); begin Edit1.SetFocus; if P > Length(S) - 1 then begin P := 0; end; Inc(p); TouchKey(Ord(S[P]),MapVirtualKey(Ord(S[P]),0),0,0); TouchKey(Ord(S[P]),MapVirtualKey(Ord(S[P]),0),KEYEVENTF_KEYUP,0); end; procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if ((Shift = [ssAlt]) and (Key = Ord('X'))) then begin Timer1.Interval := I; Timer1.Enabled := not Timer1.Enabled; end; end; end.You can add a TEdit & TTimer to run the program. The key which start/stop the timer was been set to Alt X.
------
Fishman |
linruiq
一般會員 ![]() ![]() 發表:1 回覆:6 積分:1 註冊:2005-09-14 發送簡訊給我 |
|
linruiq
一般會員 ![]() ![]() 發表:1 回覆:6 積分:1 註冊:2005-09-14 發送簡訊給我 |
HI,FISHMAN 你编的程序(假设为A程序)很好啊,现在只剩下一个快捷键的问题。
你的程序快捷键只能在本程序(A程序)有效,当运行其它程序(如运行word中)快捷键
无效,必须再转到本程序(A程序)才能使用快捷键,
能不能在运行任何其它程序时也可以使用快捷键(即A程序作为后台程序运行)?如何解决这个问题。 我做了一个小程序,同样解决不了问题。 定义一个timer2,控制timer1的运行。 procedure TForm1.Timer2Timer(Sender: TObject);
var
KeyStates:TKeyboardState;
begin
GetKeyboardState(KeyStates);
if (KeyStates[VK_NUMLOCK]=1) then
begin timer1.Enabled:=false;
end
else
begin
timer1.Enabled:=true;
//KeyStates[VK_NUMLOCK]:=0; //1时表示状态键处于ON状态
//setKeyboardState(keyStates);
end;
end; 问题依然存在,所定义的start/stop键只有在激活本程序(A程序)才有效,
将A程序作为后台运行程序快捷键就不起作用。
|
conundrum
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
|
linruiq
一般會員 ![]() ![]() 發表:1 回覆:6 積分:1 註冊:2005-09-14 發送簡訊給我 |
|
linruiq
一般會員 ![]() ![]() 發表:1 回覆:6 積分:1 註冊:2005-09-14 發送簡訊給我 |
|
Kingron
中階會員 ![]() ![]() ![]() 發表:1 回覆:51 積分:60 註冊:2005-09-14 發送簡訊給我 |
|
linruiq
一般會員 ![]() ![]() 發表:1 回覆:6 積分:1 註冊:2005-09-14 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |