系统中已定义了一个热键如:CTRL+F,如何模拟按下此键?
桌面上已有几个窗体,如何取每一个窗体的Windows Caption属性?
分可再加

解决方案 »

  1.   

    下面的代码是模拟Ctrl+C和Ctrl+V:
    //Ctrl+C: 
    keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0); 
    keybd_event(Ord('C'), MapVirtualKey(Ord('C'), 0), 0, 0); 
    keybd_event(Ord('C'), MapVirtualKey(Ord('C'), 0), KEYEVENTF_KEYUP, 0); 
    keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0) //Ctrl+V: 
    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) 
    **************************
    按下一个键最好用SendMessage,用sndkey32.pas无疑会增加程序尺寸。
    组合键(超过两个以上)用sndkey32.pas就显出优势来了。另一种解决方法,下例模拟按下Alt+Down,可参见Delphi SDK的帮助:
      keybd_event( VK_MENU, MapVirtualKey( VK_MENU, 0 ), 0 , 0 );     // Alt down 
      keybd_event( VK_DOWN, MapVirtualKey( VK_DOWN, 0 ), 0 , 0 );     // down arrow key down 
      keybd_event( VK_DOWN, MapVirtualKey( VK_DOWN, 0 ), KEYEVENTF_KEYUP , 0 );  // down arrow key up 
      keybd_event( VK_MENU, MapVirtualKey( VK_MENU, 0 ), KEYEVENTF_KEYUP , 0 );  // Alt key up 
      

  2.   

    var
      KeyState: TKeyboardState;
      OldCtrl: byte;
    begin
      GetKeyboardState(KeyState);
      OldCtrl := KeyState[VK_Ctrl];
      KeyState[VK_Ctrl]:=$80;
      SetKeyboardState(KeyState);
      SendMessage (Memo1.Handle, WM_KEYDOWN, ord('F'), 0);
      SendMessage (Memo1.Handle, WM_KEYUP, ord('F''), 0);
      KeyState[VK_Ctrl]:=OldCtrl;
      SetKeyboardState(KeyState);
    end;
      

  3.   

    2:得到每个窗口的句柄用sendmessage(handle,wm_gettext,100,integer(pchar(s)));
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject);
         var
            hCurrentWindow: HWnd;
            szText: array[0..254] of char;
         begin
            hCurrentWindow := GetWindow(Handle, GW_HWNDFIRST);
            while hCurrentWindow <> 0 do
            begin
               if GetWindowText(hCurrentWindow, @szText, 255) > 0 then
                  Memo1.Lines.Add(StrPas(@szText));
               hCurrentWindow := GetWindow(hCurrentWindow, GW_HWNDNEXT);
            end;
         end;
      

  5.   

    如果在窗体事件中如keydown中
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
    if ((ssCtrl in Shift) and ((key = ord('i')) or (key = ord('I')) )) then
    end;
    就可以了。
    如果你要监视所有的键盘敲击消息,那么你需要用WINDOWS钩子来获取
    然后用var j:integer;
         j:=getkeystate($14); //返回Caps Lock键的状态
          if ((j and 1)=1 )  then //判断CapsLock是否按下
      

  6.   

    1:直接用KEYBD_EVENT能行吗?
    2:那最后一个参数是起什么作用?