線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1975
推到 Plurk!
推到 Facebook!

关于键盘自动控制

尚未結案
linruiq
一般會員


發表:1
回覆:6
積分:1
註冊:2005-09-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-14 14:49:52 IP:61.141.xxx.xxx 未訂閱
程序要求: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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-14 17:31:37 IP:210.65.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-15 17:46:48 IP:61.141.xxx.xxx 未訂閱
hi,Fishman,刚对你的程序调试了一下,方法是不错, 不过快捷键的问题仍然没有解决,即在其它程序(如WORD)中,需按一快捷键才能进行程序的运行和停止。。。 你的方法在同一时间按下‘Z’和‘X’键,这样也不行,‘Z’和‘X’两键的按下时间需有间隔,这个间隔时间要可以调整。
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-16 08:14:46 IP:210.65.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-16 12:27:45 IP:219.134.xxx.xxx 未訂閱
hi,Fishman,thank you ,thank you!! 我现在在网吧,明天去办公室调试你的新程序, 非常感谢你的热心帮忙..............see you again !!!!
linruiq
一般會員


發表:1
回覆:6
積分:1
註冊:2005-09-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-17 10:48:01 IP:61.141.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-17 20:52:01 IP:218.175.xxx.xxx 未訂閱
關於office右鍵問題 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=64918 台灣災難都是事後算帳 無人飛行載具(Unmanned Aerial Vehicle,UAV)為什麼沒大量應用於救災行列
linruiq
一般會員


發表:1
回覆:6
積分:1
註冊:2005-09-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-18 17:25:11 IP:219.133.xxx.xxx 未訂閱
还剩快捷键问题没有解决啊,谁来帮帮忙,, fishman.....
linruiq
一般會員


發表:1
回覆:6
積分:1
註冊:2005-09-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-09-24 21:12:22 IP:61.141.xxx.xxx 未訂閱
没人来? 谁会解决..help......... 设置一个对所有窗口有效的快捷键..
Kingron
中階會員


發表:1
回覆:51
積分:60
註冊:2005-09-14

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-10-01 14:57:29 IP:61.145.xxx.xxx 未訂閱
注册一个Global HotKey即可解决你的问题: Google RegisterHotKey 即可找到答案
------
超级猛料:http://kingron.delphibbs.com
linruiq
一般會員


發表:1
回覆:6
積分:1
註冊:2005-09-14

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-10-01 23:50:19 IP:61.141.xxx.xxx 未訂閱
Kingron: RegisterHotKey函数没有使用过,可不可以具体些?
系統時間:2024-05-07 1:24:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!