vb原码:
Declare Function MapPhysToLin Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysSize As Long, ByRef PhysMemHandle) As Long
Declare Function UnmapPhysicalMemory Lib "WinIo.dll" (ByVal PhysMemHandle, ByVal LinAddr) As Boolean
Declare Function GetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByRef PhysVal As Long) As Boolean
Declare Function SetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysVal As Long) As Boolean
Declare Function GetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByRef PortVal As Long, ByVal bSize As Byte) As Boolean
Declare Function SetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByVal PortVal As Long, ByVal bSize As Byte) As Boolean
Declare Function InitializeWinIo Lib "WinIo.dll" () As Boolean
Declare Function ShutdownWinIo Lib "WinIo.dll" () As Boolean
Declare Function InstallWinIoDriver Lib "WinIo.dll" (ByVal DriverPath As String, ByVal Mode As Integer) As Boolean
Declare Function RemoveWinIoDriver Lib "WinIo.dll" () As Boolean' ------------------------------------以上是WINIO函数声明-------------------------------------------Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long'-----------------------------------以上是WIN32 API函数声明-----------------------------------------再添加下面这个过程:
Sub KBCWait4IBE()   '等待键盘缓冲区为空
Dim dwVal As Long
Do
GetPortVal &H64, dwVal, 1
'这句表示从&H64端口读取一个字节并把读出的数据放到变量dwVal中
'GetPortVal函数的用法是GetPortVal 端口号,存放读出数据的变量,读入的长度
Loop While (dwVal And &H2)
End Sub
上面的是一个根据KBC规范写的过程,它的作用是在向键盘端口写入数据前等待一段时间,后面将会用到。
然后再添加如下过程,这2个过程用来模拟按键:Public Const KBC_KEY_CMD = &H64   '键盘命令端口
Public Const KBC_KEY_DATA = &H60   '键盘数据端口Sub MyKeyDown(ByVal vKeyCoad As Long)   
'这个用来模拟按下键,参数vKeyCoad传入按键的虚拟码
Dim btScancode As Long
btScancode = MapVirtualKey(vKeyCoad, 0)  KBCWait4IBE   '发送数据前应该先等待键盘缓冲区为空
  SetPortVal KBC_KEY_CMD, &HD2, 1   '发送键盘写入命令
'SetPortVal函数用于向端口写入数据,它的用法是SetPortVal 端口号,欲写入的数据,写入数据的长度
  KBCWait4IBE
  SetPortVal KBC_KEY_DATA, btScancode, 1 '写入按键信息,按下键
  
End SubSub MyKeyUp(ByVal vKeyCoad As Long)   
'这个用来模拟释放键,参数vKeyCoad传入按键的虚拟码
Dim btScancode As Long
btScancode = MapVirtualKey(vKeyCoad, 0)  KBCWait4IBE   '等待键盘缓冲区为空
  SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令
  KBCWait4IBE
  SetPortVal KBC_KEY_DATA, (btScancode Or &H80), 1 '写入按键信息,释放键End Sub
定义了上面的过程后,就可以用它来模拟键盘输入了。在窗体模块中添加一个定时器控件,然后加入以下代码:
Private Sub Form_Load()If InitializeWinIo = False Then   
'用InitializeWinIo函数加载驱动程序,如果成功会返回true,否则返回false
  MsgBox "驱动程序加载失败!"
  Unload Me
End If
Timer1.Interval=3000
Timer1.Enabled=True
End SubPrivate Sub Form_Unload(Cancel As Integer)
ShutdownWinIo '程序结束时记得用ShutdownWinIo函数卸载驱动程序
End SubPrivate Sub Timer1_Timer()
Dim VK_A as Long = &H41
MyKeyDown VK_A   
MyKeyUp VK_A   '模拟按下并释放A键
End Sub
/////////
以下是我写的delphi:
var
  Form1: TForm1;
 Function MapPhysToLin(PhysAddr,PhysSize:Longint;var PhysMemHandle:Boolean):Longint;stdcall;external 'WinIo.dll';
 Function UnmapPhysicalMemory(PhysMemHandle,LinAddr:Boolean):Boolean;stdcall;external 'WinIo.dll';
 Function GetPhysLong(PhysAddr:Longint;var PhysVal:Longint):Boolean;stdcall;external 'WinIo.dll';
 Function SetPhysLong(PhysAddr,PhysVal:Longint):Boolean;stdcall;external 'WinIo.dll';
 Function GetPortVal(PortAddr:Integer;var PortVal:Longint;bSize:Byte):Boolean;stdcall;external 'WinIo.dll';
 Function SetPortVal(PortAddr:Integer;PortVal:Longint;bSize:Byte):Boolean;stdcall;external 'WinIo.dll';
 Function InitializeWinIo():Boolean;stdcall;external 'WinIo.dll';
 Function ShutdownWinIo():Boolean;stdcall;external 'WinIo.dll';
 Function InstallWinIoDriver(DriverPath:String;Mode:Integer):Boolean;stdcall;external 'WinIo.dll';
 Function RemoveWinIoDriver():Boolean;stdcall;external 'WinIo.dll';
implementation
Const
   KBC_KEY_CMD:Integer=&H64;
   KBC_KEY_DATA:Integer=&H60;{$R *.dfm}procedure TForm1.KBCWait4IBE(Sender: TObject);
var
   dwVal:Longint;
begin
   While ((dwVal) and (&H2)) <> 0 do
         begin
            GetPortVal(&H64, dwVal, 1);
         end;
end;procedure TForm1.MyKeyDown(Sender: TObject);
var
   btScancode:Longint;
begin
   btScancode:=MapVirtualKey(vKeyCoad,0);
   KBCWait4IBE();
   SetPortVal(KBC_KEY_CMD,&HD2,1);
   KBCWait4IBE();
   SetPortVal(KBC_KEY_DATA,btScancode,1);
end;
procedure TForm1.MyKeyUp(Sender: TObject);
var
   btScancode:Longint;
begin
   KBCWait4IBE();
   SetPortVal(KBC_KEY_CMD, &HD2, 1);
   KBCWait4IBE();
   SetPortVal(KBC_KEY_DATA,((btScancode)or(&H80)),1);end;procedure TForm1.Timer1Timer(Sender: TObject);
var
   VK_A:Longint=&H41;
begin
MyKeyDown VK_A;
MyKeyUp VK_A;   '模拟按下并释放A键
end;
end. 
//错误很多 集中在&H64和KBCWait4IBE缺少参数上,另:调用的dll文件WinIo.dll只要同本程序放在同一目录就可以了吧  高手来拿分吧..

解决方案 »

  1.   

    Const
       KBC_KEY_CMD:Integer=&H64;   //这里应该是: $64
       KBC_KEY_DATA:Integer=&H60;  //            $60
      

  2.   

    不错,解决了一部分,还有几个问题:
    1.原码中有一行是:
    Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
    -----------------------------------以上是WIN32 API函数声明-----------------------------------------
    //在delphi中这就不用写了吧
    2.不知是不是问题1造成的原因
    btScancode = MapVirtualKey(vKeyCoad, 0)里的vKeyCoad无法识别
    3.KBCWait4IBE()过程说缺少参数
    //KBCWait4IBE过程,不知少什么参数
    procedure TForm1.KBCWait4IBE(Sender: TObject);
    var
       dwVal:Longint;
    begin
       While ((dwVal) and (&H2)) <> 0 do
             begin
                GetPortVal(&H64, dwVal, 1);
             end;
    end;4.还有个问题,原码中有中定义是ByRef PhysMemHandle,没说明PhysMemHandle是什么类的啊 ,是布尔吗?难道还有种默认类型?
    5.最后,要调用的dll文件WinIo.dll我把它放在程序同目录下了就可以了吧?
      

  3.   

    1.原码中有一行是:
    Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long这个DELPHI的Windows单元已经有定义了!2.
    procedure TForm1.MyKeyDown(Sender: TObject);
    var
       btScancode:Longint;
    begin
       btScancode:=MapVirtualKey(vKeyCoad,0);
       KBCWait4IBE();
       SetPortVal(KBC_KEY_CMD,&HD2,1);
       KBCWait4IBE();
       SetPortVal(KBC_KEY_DATA,btScancode,1);
    end;
    你好象没传参数给vKeyCode ??3.这不是个标准过程吗?怎么会少参数,是不是你的定义有问题!4.如果没有猜错的话,这应该是无类型参数,也就是传入任意指针,在DELPHI里就有一个这样的
    过程
                                                                     //注意这里!
    procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
    var
      Instance: TComponent;
    begin
    ...5.可以!
      

  4.   

    在网上已经找到delphi 版的了
    http://cache.baidu.com/c?word=vk%3B%5F%3B1%2C31&url=http%3A//www%2Ecnblogs%2Ecom/shf/archive/2006/03/31/363646%2Ehtml&p=8e6d831386cc47ad1fbe9b7e0b0a8c&user=baidu我还有一个问题,能不能通过模拟按键使用一个热键
    现在实际的情况就是不行,无论是局部模拟按键,全局模拟按键还是这驱动级的模拟按键都不
      

  5.   

    http://blog.csdn.net/lineage20008/archive/2007/05/15/1610145.aspx 地址给错了
      

  6.   

    怎么模拟复合键?比如我要模拟ctrl+a键