using System;
 using System.Runtime.InteropServices;
 using System.Text; 
  
 namespace ConsoleApplication8{
 class Class1{
 [STAThread]
 static void Main(string[] args){
 // Display current status of keys.
 Console.WriteLine("**BEFORE**\r\nCAP: {0}\r\nSCR: {1}\r\nNUM: {2}", 
 Keyboard.GetState(VirtualKeys.VK_CAPITAL)?"ON":"OFF",
 Keyboard.GetState(VirtualKeys.VK_SCROLL)?"ON":"OFF",
 Keyboard.GetState(VirtualKeys.VK_NUMLOCK)?"ON":"OFF"
 );//Toggle all the keys:
 Keyboard.SetState(
 VirtualKeys.VK_CAPITAL, 
 !Keyboard.GetState(VirtualKeys.VK_CAPITAL)
 );Keyboard.SetState(
 VirtualKeys.VK_SCROLL, 
 !Keyboard.GetState(VirtualKeys.VK_SCROLL)
 );
 Keyboard.SetState(
 VirtualKeys.VK_NUMLOCK, 
 !Keyboard.GetState(VirtualKeys.VK_NUMLOCK)
 );
 // Display new status of keys.
 Console.WriteLine(
 "\r\n**AFTER**\r\nCAP: {0}\r\nSCR: {1}\r\nNUM: {2}", 
 Keyboard.GetState(VirtualKeys.VK_CAPITAL)?"ON":"OFF",
 Keyboard.GetState(VirtualKeys.VK_SCROLL)?"ON":"OFF",
 Keyboard.GetState(VirtualKeys.VK_NUMLOCK)?"ON":"OFF"
 );
 Console.ReadLine();
 }
 }
 public enum VirtualKeys: byte{
 VK_NUMLOCK = 0x90,
 VK_SCROLL = 0x91,
 VK_CAPITAL = 0x14
 }
 class Keyboard{
 const uint KEYEVENTF_EXTENDEDKEY = 0x1;
 const uint KEYEVENTF_KEYUP = 0x2;
 [DllImport("user32.dll")]
 static extern short GetKeyState(int nVirtKey);
 [DllImport("user32.dll")]
 static extern void keybd_event(
 byte bVk, 
 byte bScan, 
 uint dwFlags, 
 uint dwExtraInfo
 );
 public static bool GetState(VirtualKeys Key){
 return (GetKeyState((int)Key)==1);
 }
 public static void SetState(VirtualKeys Key, bool State){
 if(State!=GetState(Key)){
 keybd_event(
 (byte)Key, 
 0x45, 
 KEYEVENTF_EXTENDEDKEY | 0, 
 0
 );
 keybd_event(
 (byte)Key, 
 0x45, 
 KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 
 0
 );
 }
 }
 }
 }//and you can do mouse_event operation like it.


 

对于模拟键盘,除了利用keybd_event,更简单的是使用sendkeys,而且keybd_event已经被sendinput取代。