[转帖]如何在PB中模拟按键
摘自《远程续缘》第35期(<a href="http://jfzcc.yeah.net/" target="_blank" >http://jfzcc.yeah.net</A>) <BR> 很多人都知道怎样在datawindow按下enter键模拟tab键的效果: <BR> 在datawindow中扩展出pbm_dwnprocessenter事件: 加入代码 <BR> Send( Handle( This),256,9,Long(0,0)) <BR> Return 1 <BR> 这种方法曾经出现在晓通那一套天价的书上,网上各网站你抄我的,我抄你的,好象只有这一种方法,一种思路,不知误导了多少人。 今天我就来消清晓通的流毒。 <BR> 这种方法其实效果也还可以,只不过是很久以前的Windows 3.1的技术了,在Windows95以上的版本,我们有更好,更规范,功能更强的方法来实现。 <BR> 在windows95以上,特意增加了一个API调用,keybd_event,这个API调用的功能就是模拟键盘击键。 定义如下: <BR> subroutine keybd_event(uint bVk,uint bScan,long dwFlags,long dwExtraIn <BR> fo ) library 'user32.dll' <BR> // 以下这段抄自MSDN, 是关于各参数的说明 <BR> Parameters <BR> bVk <BR> Specifies a virtual-key code. The code must be a value in the range 1 <BR> to 254. <BR> bScan <BR> Specifies a hardware scan code for the key. <BR> dwFlags <BR> A set of flag bits that specify various aspects of function operation. <BR> An application can use any combination of the following predefined co <BR> nstant values to set the flags. Value Meaning <BR> KEYEVENTF_EXTENDEDKEY If specified, the scan code was preceded by a pr <BR> efix byte having the value 0xE0 (224). <BR> KEYEVENTF_KEYUP If specified, the key is being released. If not specif <BR> ied, the key is being depressed. <BR> <BR> dwExtraInfo <BR> Specifies an additional 32-bit value associated with the key stroke. <BR> <BR> 谁有耐心慢慢看去,以下只说明我们要用的两个参数 <BR> bVk,指需要模拟的击键 <BR> dwflags, =0 ,按下 = 2 ,释放 <BR> <BR> 下面我们看看如何实现以下功能: <BR> 按下enter键以及下箭头,相当于按下tab键 <BR> 按下上箭头,相当于按下Shift-tab键 <BR> 如果是在datawindow下,扩展出pbm_dwnkey,增加如下代码: <BR> If key = KeyEnter! Or Key = KeyDownArrow! Then <BR> keybd_event ( 9, 0, 0 , 0 ) // 按下tab <BR> keybd_event ( 9, 0, 2, 0 ) // 释放tab <BR> Return 1 <BR> End If <BR> <BR> If Key = KeyUpArrow! Then <BR> keybd_event ( 16, 0, 0, 0 ) // 按下shift <BR> keybd_event ( 9, 0, 0 , 0 ) // 按下tab <BR> keybd_event ( 9, 0, 2, 0 ) // 释放tab <BR> keybd_event ( 16, 0, 2, 0 ) // 释放shift <BR> Return 1 <BR> End If <BR> <BR> 我们也可以在window级实现以上功能,很简单,将上面代码加在window的key事件 <BR> 中即可. <BR> keybd_event还有一些很神奇的作用,比如以下代码打开windows的“开始菜单” <BR> keybd_event ( 91, 0, 0 , 0 ) // 按下win(不知道应该叫什么)键 <BR> keybd_event ( 91, 0, 2, 0 ) // 放开 <BR> <P>补充:原文中没有这个API在pb中的声明语法,现补充如下:</P><P>SUBROUTINE keybd_event ( Integer bVk, Integer bScan, Long dwFlags, Long dwExtraInfo) LIBRARY "user32"<BR></P>
页:
[1]