免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2551 | 回复: 1

想用perl拦截键盘消息 [复制链接]

论坛徽章:
0
发表于 2011-03-05 10:13 |显示全部楼层
本帖最后由 maybenot 于 2011-03-05 10:18 编辑

用了个Win32::GuiTest往另一个界面程序的控件里面自动填写内容,现在还想拦截键盘消息,例如用户在某个编辑框按回车的时候我给它改成另一个按键。

我查了一些资料,说是要用Win32::API,SetWindowsHookEx等函数,代码copy了不好用,请教高手怎么解决?

这是网上找得代码:
my $setWindowsHookEx = new Win32::API('User32', 'SetWindowsHookEx', 'IKPL', 'P');
my $callback = Win32::API::Callback->new(
                                         sub
                                         {
                                           my($Code, $wParam, $lParam) = @_;
                                           if($Code eq "0")
                                           {
                                               print "Welcome to Hooking";
                                           }
                                           else
                                           {
                                              return CallNextHookEx($hook_handle, $code,$wParam, $lparam);
                                           }
                                           return 0;
                                          },"DD", "P",
                                         );
my $hook_handle = $setWindowsHookEx->Call(13, $callback, NULL, 0);

论坛徽章:
0
发表于 2011-03-13 00:29 |显示全部楼层
本帖最后由 aef25u 于 2011-03-13 00:32 编辑

回复 1# maybenot

之前写了个,方便使用手提电脑录入问卷,不知这个对你有没有帮助。
实现了数字0..10,大小写字母a..z字符的录入,将"-"变为10,其他键输出Virtual keycode of the key 。
功能键:Esc、Backspace、enter、4个方向键、大小写切换、小键盘切换可用。
按enter键时,附加保存最后一行至txt文档。
  1. #!/usr/bin/perl
  2. use threads;
  3. use Thread::Queue;
  4. use Win32::Console;
  5. use feature ":5.10";
  6. my $In  = new Win32::Console(STD_INPUT_HANDLE)  || die;
  7. my $Out = new Win32::Console(STD_OUTPUT_HANDLE) || die;

  8. #多线程生产者消费者
  9. my $q        = Thread::Queue->new();
  10. my $producer = threads->create( \&produce );
  11. my $consumer = threads->create( \&consume );
  12. $producer->join();
  13. $consumer->join();

  14. sub produce {
  15.     while (1) {
  16.         my @event = $In->Input();

  17.         #   keyboard event type = 1 key down=1  repeat count =1
  18.         if ( ($event[0] == 1)&&($event[1] == 1)&&($event[2] == 1) ) {
  19.             my ( $virtualKey, $asciiKey ) = @event[ 3, 5 ];
  20.             given ($virtualKey) {
  21.                 when (27)  { exit 0 }
  22.                 when (/20|144/)  { next }
  23.                 when (32) { $Out->Write(" ") }
  24.                 when ([48,96]) { $Out->Write("0 ") }
  25.                 when (189) { $Out->Write("10 ") }
  26.                 when (8) {
  27.                     my ( $x, $y ) = $Out->Cursor();
  28.                     $Out->Cursor( $x - 2, $y );
  29.                     $Out->Write(" ")
  30.                 }
  31.                 when (13) { $Out->Write("\n"); save_chr() }
  32.                 when (37) {
  33.                     my ( $x, $y ) = $Out->Cursor();
  34.                     $Out->Cursor( $x - 1, $y )
  35.                 }
  36.                 when (39) {
  37.                     my ( $x, $y ) = $Out->Cursor();
  38.                     $Out->Cursor( $x + 1, $y )
  39.                 }
  40.                 when (38) {
  41.                     my ( $x, $y ) = $Out->Cursor();
  42.                     $Out->Cursor( $x, $y - 1 )
  43.                 }
  44.                 when (40) {
  45.                     my ( $x, $y ) = $Out->Cursor();
  46.                     $Out->Cursor( $x, $y + 1 )
  47.                 }
  48.                 when ([ 49 .. 57, 65 .. 90, 97..105 ]) { $q->enqueue( chr($asciiKey) ) }
  49.                 default { $q->enqueue($virtualKey) }

  50.             }
  51.         }
  52.     }
  53.     sleep(1);
  54. }

  55. sub consume {
  56.     while ( my $key = $q->dequeue() ) {
  57.         $Out->Write("$key ");
  58.     }
  59. }

  60. sub save_chr {
  61.     my @info = $Out->Info();
  62.     my $Rchar = $Out->ReadChar( $info[0], 0, $info[3] - 1 );
  63.     open( FH, ">>Result.txt" );
  64.     print FH $Rchar . "\n";
  65.     close(FH);
  66. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP