点击按钮向一个位置的窗体发送键盘虚拟值!~
如按下Ctrl+T  如何用代码表示?谢谢,如果有代码另外多加200!

解决方案 »

  1.   

    var   
          TheWindow   :   HWND;   
      begin   
          TheWindow   :=   FindWindow(nil,   '计算器');   
          if   TheWindow   <>   0   then   
              PostMessage(TheWindow,WM_CLOSE,0,0);   
      end;   
        
        
      procedure   EndProcess(AExeName:   string);   
      var   
          lppe:   TProcessEntry32;   
          found   :   boolean;   
          Hand   :   THandle;   
      begin   
          Hand   :=   CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);   
          found   :=   Process32First(Hand,lppe);   
          while   found   do   
          begin   
              if   UpperCase(StrPas(lppe.szExeFile))   =   UpperCase(AExeName)   then   
              begin   
                  TerminateProcess(OpenProcess(PROCESS_TERMINATE,   true,   
                      lppe.th32ProcessID),   0);   
                  Exit;   
              end   
              else   
                  found   :=   Process32Next(Hand,lppe);   
          end;   
      end;   
        
      const   
      PROCESS_TERMINATE   =   $0001;   
      var   
          ProcessHandle   :   THandle;   
          ProcessID:   Integer;   
          TheWindow   :   HWND;   
      begin   
          TheWindow   :=   FindWindow(nil,   '计算器');   
          GetWindowThreadProcessID(TheWindow,   @ProcessID);   
          ProcessHandle   :=   OpenProcess(PROCESS_TERMINATE,   FALSE,   ProcessId);   
          TerminateProcess(ProcessHandle,4);   
      end;   
      

  2.   

    虚拟键:   PostMessage(TheWindow,WM_CHAR,x,0);     等类似参考一下。   
        case     x   
            keybd_event(VK_Control,   MapVirtualKey(VK_Control,   0),   0,   0);   
        
        
      发送一个标示:   
        
        
      postmessage(Edit1.Handle,WM_KEYDOWN,65,0);   
      这是一个API函数。   
      Edit1.Handle   是句柄;   
      WM_KEYDOWN   是按下键的消息;   
      65   是指键'a'的值   65……90   是   a……z;   
      回车键是   VK_RETURN   
          
        
        
      来自:fu_xiang_yu,   时间:2001-6-1   17:50:00,   ID:550400   
      (转)   
        
      ◇[DELPHI]发送虚拟键值ctrl   V   
      procedure   sendpaste;   
      begin   
      keybd_event(VK_Control,   MapVirtualKey(VK_Control,   0),   0,   0);   
      keybd_event(ord('V'),   MapVirtualKey(ord('V'),   0),   0,   0);   
      keybd_event(ord('V'),   MapVirtualKey(ord('V'),   0),   KEYEVENTF_KEYUP,   0);   
      keybd_event(VK_Control,   MapVirtualKey(VK_Control,   0),   KEYEVENTF_KEYUP,   0);   
      end;   
        
      ◇[DELPHI]按键接受消息   
      OnCreate事件中处理:Application.OnMessage:=MyOnMessage;   
      procedure   TForm1.MyOnMessage(var   MSG:TMSG;var   Handle:Boolean);   
      begin   
      if   msg.message=256   then   ...   //ANY键   
      if   msg.message=112   then   ...   //F1   
      if   msg.message=113   then   ...   //F2   
      end;   
        
      ◇[DELPHI]关于键盘常量名   
      VK_BACK/VK_TAB/VK_RETURN/VK_SHIFT/VK_CONTROL/VK_MENU/VK_PAUSE/VK_ESCAPE   
      /VK_SPACE/VK_LEFT/VK_RIGHT/VK_UP/VK_DOWN   
      F1--F12:$70(112)--$7B(123)   
      A-Z:$41(65)--$5A(90)   
      0-9:$30(48)--$39(57)   
      RegisterHotKey(Handle,11,0,192);   //   ~键的虚拟码   
        
        
       这一节中,只简单地把键盘的主要虚拟键码列出来,如果需要更详细的信息,则在msdn上的Platform   SDK/User   Interface   Services/User   Input/VirtualKey   Codes可以看到完整的键码列表。     
       首先列出,然后再做解释:   
        
        
      --------------------------------------------------------------------------------   
        
      十进制值   标识符   IBM兼容键盘    
        
      --------------------------------------------------------------------------------   
        
      1      VK_LBUTTON     鼠标左键     
      2      VK_RBUTTON     鼠标右键     
      3      VK_CANCEL   Ctrl+Break(通常不需要处理)     
      4      VK_MBUTTON     鼠标中键     
      8      VK_BACK    Backspace     
      9      VK_TAB       Tab     
      12   VK_CLEAR      Num   Lock关闭时的数字键盘5     
      13   VK_RETURN   Enter(或者另一个)     
      16   VK_SHIFT      Shift(或者另一个)     
      17   VK_CONTROL     Ctrl(或者另一个)     
      18   VK_MENU    Alt(或者另一个)     
      19   VK_PAUSE      Pause     
      20   VK_CAPITAL     Caps   Lock     
      27   VK_ESCAPE   Esc     
      32   VK_SPACE      Spacebar     
      33   VK_PRIOR      Page   Up     
      34   VK_NEXT    Page   Down     
      35   VK_END       End     
      36   VK_HOME    Home     
      37      VK_LEFT      左箭头     
      38   VK_UP       上箭头     
      39   VK_RIGHT   右箭头     
      40   VK_DOWN      下箭头     
      41   VK_SELECT     可选     
      42   VK_PRINT   可选     
      43   VK_EXECUTE  可选     
      44   VK_SNAPSHOT  Print   Screen     
      45   VK_INSERT   Insert     
      46   VK_DELETE  Delete     
      47   VK_HELP   可选     
      48~57    无        主键盘上的0~9     
      65~90    无      A~Z     
      96~105    VK_NUMPAD0~VK_NUMPAD9   Num   Lock打开时数字键盘上的0~9     
      106     VK_NULTIPLY           数字键盘上的*     
      107   VK_ADD             数字键盘上的+     
      108     VK_SEPARATOR        可选     
      109     VK_SUBTRACT           数字键盘上的-     
      110     VK_DECIMAL         数字键盘上的.     
      111     VK_DIVIDE            数字键盘上的/     
      112~135   VK_F1~VK_F24        功能键F1~F24     
      144     VK_NUMLOCK         Num   Lock     
      145     VK_SCROLL            Scroll   Lock     
        
      --------------------------------------------------------------------------------   
        
        
      下边三个是MS键盘上的:     
        
      --------------------------------------------------------------------------------   
        
      十进制值   标识符   Microsoft自然键盘    
        
      --------------------------------------------------------------------------------   
        
      91   VK_LWIN   左Windows键    
      92   VK_RWIN   右Windows键    
      93   VK_APPS   Applications键    
        
      --------------------------------------------------------------------------------   
        
        
      两种键盘消息:     
      非系统键   WM_KEYDOWN   WM_KEYUP    
      系统键   WM_SYSKEYDOWN   WM_SYSKEYUP    
        
        
       在键盘消息中,虚拟键码都保存在wParam参数中。这些虚拟键码的定义,是在winuser.h文件中,所以当用到键盘的虚拟键码时,要包含这个文件,不过,如果已经包含了windows.h文件,那么就不需要再包含winuser.h文件了,因为windows.h文件已经包含了winuser.h文件。     
       Print   Screen键一般不需要处理。     
       VK_SELECT、VK_PRINT、VK_EXECUTE和VK_HELP很少出现。     
       数字和字母的虚拟键码是ASCII码。     
       F1~F24的功能键中,windows只用到了F1~F10。     
       用GetKeyState(int):(参数是以VK_开头的虚拟键码)获得所有有开关性质的键的状态(是否按下),比如shift、Alt等。用GetAsyncKeySate();获得当前某键的状态。     
       WM_SYSKEYDOWN和WM_SYSKEYUP消息由Windows系统函数使用,所以用户可以不管她。     
       WM_CHAR和WM_DEADCHAR消息是从WM_KEYDOWN得到的,而WM_SYSCHAR和WM_SYSDEADCHAR消息是从WM_SYSKEYDOWN消息得到的。在某些非U.S.英语键盘上,有些键用于给字母加上音调,因为它们本身不产生字符,所以称之为“死键”。     
       RegisterClass有两个版本,分别是ANSI版本的RegisterClassA和Uncode版本的RegisterClassW。如果程序用RegisterClass注册窗口类,那么当定义UNICODE标识符时就调用RegisterClassW,否则就调用RegisterClassA。同一窗口过程可能会用到两个窗口类,她们有可能用两种不同的版本注册。用下列函数可以获得窗口注册的类型:     
      fUnicode=IsWindowUnicode(hwnd);   
      如果hwnd的窗口过程获得Unicode消息,那么变量fUnicode将为TRUE,,这表明窗口是基于用RegisterClassW注册的窗口类。     
       下一节将对过去的第三个程序做修改,以加上键盘控制。   911   
      

  3.   


    procedure   SendKey(const   mKey:   Word;   mShiftState:   TShiftState;   mCount:   Integer   =   1);   overload;   
      const   
          cExtended:   set   of   Byte   =   [VK_UP,   VK_DOWN,   VK_LEFT,   VK_RIGHT,   VK_HOME,   
              VK_END,   VK_PRIOR,   VK_NEXT,   VK_INSERT,   VK_DELETE];   
        
          procedure   pKeyboardEvent(mKey,   mScanCode:   Byte;   mFlags:   Longint);   
          var   
              vKeyboardMsg:   TMsg;   
          begin   
              keybd_event(mKey,   mScanCode,   mFlags,   0);   
              while   PeekMessage(vKeyboardMsg,   0,   WM_KEYFIRST,   WM_KEYLAST,   PM_REMOVE)   do   begin   
                  TranslateMessage(vKeyboardMsg);   
                  DispatchMessage(vKeyboardMsg);   
              end;   
          end;   {   pKeyboardEvent   }   
        
          procedure   pSendKeyDown(mKey:   Word;   mGenUpMsg:   Boolean);   
          var   
              vScanCode:   Byte;   
              vNumState:   Boolean;   
              vKeyBoardState:   TKeyboardState;   
          begin   
              if   (mKey   =   VK_NUMLOCK)   then   begin   
                  vNumState   :=   ByteBool(GetKeyState(VK_NUMLOCK)   and   1);   
                  GetKeyBoardState(vKeyBoardState);   
                  if   vNumState   then   
                      vKeyBoardState[VK_NUMLOCK]   :=   (vKeyBoardState[VK_NUMLOCK]   and   not   1)   
                  else   vKeyBoardState[VK_NUMLOCK]   :=   (vKeyBoardState[VK_NUMLOCK]   or   1);   
                  SetKeyBoardState(vKeyBoardState);   
                  Exit;   
              end;   
        
              vScanCode   :=   Lo(MapVirtualKey(mKey,   0));   
              if   (mKey   in   cExtended)   then   begin   
                  pKeyboardEvent(mKey,   vScanCode,   KEYEVENTF_EXTENDEDKEY);   
                  if   mGenUpMsg   then   
                      pKeyboardEvent(mKey,   vScanCode,   KEYEVENTF_EXTENDEDKEY   or   KEYEVENTF_KEYUP)   
              end   else   begin   
                  pKeyboardEvent(mKey,   vScanCode,   0);   
                  if   mGenUpMsg   then   pKeyboardEvent(mKey,   vScanCode,   KEYEVENTF_KEYUP);   
              end;   
          end;   {   pSendKeyDown   }   
        
          procedure   pSendKeyUp(mKey:   Word);   
          var   
              vScanCode:   Byte;   
          begin   
              vScanCode   :=   Lo(MapVirtualKey(mKey,   0));   
              if   mKey   in   cExtended   then   
                  pKeyboardEvent(mKey,   vScanCode,   KEYEVENTF_EXTENDEDKEY   and   KEYEVENTF_KEYUP)   
              else   pKeyboardEvent(mKey,   vScanCode,   KEYEVENTF_KEYUP);   
          end;   {   pSendKeyUp   }   
        
      var   
          I:   Integer;   
      begin   
          for   I   :=   1   to   mCount   do   begin   
              if   ssShift   in   mShiftState   then   pSendKeyDown(VK_SHIFT,   False);   
              if   ssCtrl   in   mShiftState   then   pSendKeyDown(VK_CONTROL,   False);   
              if   ssAlt   in   mShiftState   then   pSendKeyDown(VK_MENU,   False);   
              pSendKeyDown(mKey,   True);   
              if   ssShift   in   mShiftState   then   pSendKeyUp(VK_SHIFT);   
              if   ssCtrl   in   mShiftState   then   pSendKeyUp(VK_CONTROL);   
              if   ssAlt   in   mShiftState   then   pSendKeyUp(VK_MENU);   
          end;   
      end;   {   SendKey   }   
        
      //demo   
      SendKey(VK_DOWN,   [ssAlt]);  這是伴水以前寫的。DELPHI5的安裝盤裏LIB裏有一個 sndkey32.pas    裏面有SendKeys  就是做這個的,太久了,不知道名字有沒有寫錯。