怎么样转换键盘按键,比如键盘上敲"a",则输入"m"? ( 积分: 200 )

  • 主题发起人 主题发起人 whbest
  • 开始时间 开始时间
W

whbest

Unregistered / Unconfirmed
GUEST, unregistred user!
写了个HOOK,可以截获屏蔽按键,但是不能更改按键,请问各位大侠有好的解决方案么?
 
delphi群:23981160,爱好d的都来
 
用HOOK当然可以修改按键
 
你是不是war3啊 ,要改建! 用hook可以改的,我原来写过
 
是啊,截获键盘消息,然后销毁,在发送个你需要的
 
To jjtl:
请教是如果更改的,希望给出代码

To lovezyp:
这个不是我想要的,谢谢
 
帮你顶一个,顺便发个交流群:
无论你是超极菜鸟,亦或是绝顶高手,在这里偶们静下心来平等地交流学习:
delphi交流群:4654765(delphi天堂)欢迎您的加入!让我们共同进步!!
加入者必须改名片为:{地点}+姓名 注:不改者勿扰!
 
楼上的菜鸟群就不发再发了,
按你的介绍,绝顶高手难道也有需要向超级菜鸟学习的地方?
所以可以确定里面全是菜鸟,进去就会被不停地提些低级问题,而无法得到学习。
问多了高手也会不耐烦,也失去了进群学习地意义。
从且确定此群水平。
 
楼主要更改起码要给出更改规则呀
 
to 暗夜中独舞

不好意思,没有把意思说清楚!现在加上了
 
已经屏蔽了那就离目的不远了
再屏幕之后再发一个消息,把字符给目标TEDIT就可以了呀
 
to 暗夜中独舞 使用PostMessage(hWnd, WM_CHAR, 'A', 0); 到是可以发,但是要找到hWnd,用AttachThreadInput方式获取在某些方式下也不好用!
 
如果你要填充到目标输入框就肯定要找到句柄
对于网页的话可以利用COM原理找到,,如果你有需要的话我可以贴上来
非网页直接找到光标所在的窗口的句柄就可以了
 
非网页直接找到光标所在的窗口的句柄的例子我也有,我想是不是还有一个其它的方式来实现
 
我个人觉的,要填充到目标窗口的话就一定要找到目标窗口的句柄
而至于找句柄我觉的通过光标是最简单也是最有效的办法
我也希望有牛人想出新的办法!关注中...
 
再比如我做一个模拟键盘,怎样获取想输入框的handle呢
 
在网上只找到了一个类似的解决方案

监控键盘并在得到特定按键后输出特殊字到剪贴板【文章来自:开店乐KaiDianLe.Com】

打字时,输入特殊字符总是那么令人讨厌,像α、β、γ、μ、π、Φ、Δ、℃、℉、£之类。为了简化这些字符的输入,设计了这个程序。不过,这里只是捕捉“A”,然后把“α”字符送到剪贴板。为了使程序比较实用,请自己加入判断Ctr,Alt、shift按键是否toggled的代码,我就不写全了。
设计思路,设计后台线程监控键盘,看有哪些按键按下了。当发现“A”按下(其实如果要实用的话应该是判断Ctr+****+A,以免冲突)后,把“α”字符送到剪贴板,然后,用Ctr+V就可以贴到你想输出到的地方了。
具体实现,建立一个窗体,添加两个按钮,一个用来启动hook,一个用来unhook。这里用了日志钩子,这样它本身就是后台线程了,无论窗体是否Active,都能运行。在钩子里,用一个EVENTMSG来得到键盘按键的信息,消息里的Paraml的低位就是按下的按键的ASCII码,得到这个,就可以打开剪贴板,清空,设置Format,设置剪贴板内容了。这样就大功告成了。
为了写这一段代码,我看了hubdog整理《Delphi之未经证实的葵花宝典》(version 2.5)所有关于钩子和剪贴板的文章,搜遍了csdn《程序员大本营》delphi部分的文章和带源码的控件或程序。花了我十几个小时,才写出来了。结果实际上就是十几行代码。
哎!编程这东西,不是不会,而是不知道呀!如果那位高手设法捕捉活动窗口,用WM_CopyData或IPC机制,把字符直接输出到当前想输出到的地方,那就完美了。我累了,暂时就先用剪贴板吧!


unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;



var
Form1: TForm1;
hHook:integer;
EventArr:EVENTMSG;

implementation

function HookProc(iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall;
var
c:integer;


begin
Result := 0;
If iCode < 0 then Result := CallNextHookEx(hHook,iCode,WParam,LParam);
EventArr:=pEventMSG(lParam)^;//通过钩子的Lparam参数,让EventArr得到键盘的消息
If iCode = HC_ACTION then file://是否钩到东西
If EventArr.message=wm_keydown then Begin // 看按键是否被按下

c:=lo(EventArr.paramL);//Paraml的低位就是按下的按键的ASCII码
if c=65 then
begin

clipboard.Open;//打开剪贴板,清空,设置Format,设置剪贴板内容
clipboard.Clear;
clipboard.Formats[CF_text];
clipboard.setTextbuf(pchar('α'));
Clipboard.Close;
end;


end;


end;


{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.Caption:='hook';
Button2.Caption:='unhook';
Button2.Enabled:=False;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
file://建立键盘操作消息hook链
hHook:=SetwindowsHookEx(WH_JOURNALRECORD,HookProc,HInstance,0);
Button2.Enabled:=True;
Button1.Enabled:=False;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
UnHookWindowsHookEx(hHook);//卸钩子
hHook:=0;
Button1.Enabled:=True;
Button2.Enabled:=False;


end;

end.
 
使用PostMessage解决了,现在的问题一个键怎样输出汉字,正在尝试中....
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
689
import
I
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部