Symulacja skrótu klawiaturowego

0

Chciałbym się dowiedzieć, jak mogę zasymulować skrót klawiaturowy dla konkretnej aplikacji działającej w tle?
Z góry dzięki

0

W delphi kody klawiszy mozesz zapisac na dwa sposoby w formie ascii oraz zwyczajny, czyli
np klawisz enter możemy zapisać jako:

key := #13;

lub

keybd_event(VK_Return, 0, 0, 0);

Kilka przykladow zastosowania kodów klawiszy:
Aby zasymulowac klawisz kropki lub jakis inny znak ktorego nie ma w vk_ mozna to zrobic w ten sposob

keybd_event(VkKeyScan('.'), 0, 0, 0);
keybd_event(VkKeyScan('.'), 0, KEYEVENTF_KEYUP, 0);

lub inny znak

keybd_event(VkKeyScan(';'), 0, 0, 0);
keybd_event(VkKeyScan(';'), 0, KEYEVENTF_KEYUP, 0);

Jeśli chcesz aby VkKeyScan bylo w edicie musisz zastosować taki kod:

keybd_event(VkKeyScan(edit1.text[1]), 1, 0, 0);
keybd_event(VkKeyScan(edit1.text[1]), 1, KEYEVENTF_KEYUP, 0);

Symulacja przyciśnięcia 2 klawiszy, np.: 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);

Symulacja przyciśnięcia 2 klawiszy, np.: Alt + Tab

keybd_event(VK_menu, 0, 0, 0);
keybd_event(VK_tab, 0, 0, 0);
keybd_event(VK_tab, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_menu, 0, KEYEVENTF_KEYUP, 0);

Polskie znaki typu [ą ć ę ł ń ó ś ż ź], aby móc w programie wywołać polskie znaki
musimy wykorzystać kombinację 3 klawiszy, np.: Ctrl + Alt + literka [a c e l n o s z x]

keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event(VK_MENU, 0, 0, 0);
keybd_event(ord('A'), 0, 0, 0);
keybd_event(ord('A'), 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);

Inne wykorzystanie symulacji, (NIE DZIAŁA PRAWIDŁOWO NA WSZYSTKIE PRZYCISKI !!)

procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean);
{
Parameters :
* key : virtual keycode of the key to send. For printable keys this is simply the
ANSI code (Ord(character)) .
* shift : state of the modifier keys. This is a set, so you can set several of these
keys (shift, control, alt, mouse buttons) in tandem. The TShiftState type is declared
in the Classes Unit.
* specialkey: normally this should be False. Set it to True to specify a key on the
numeric keypad, for example.

Description:
Uses keybd_event to manufacture a series of key events matching the passed parameters.
The events go to the control with focus. Note that for characters key is always the
upper-case version of the character. Sending without any modifier keys will result
in a lower-case character, sending it with [ ssShift ] will result in an upper-case
character!
}
type
  TShiftKeyInfo = record
                   shift: Byte;
                   vkey: Byte;
                   end;
 ByteSet = set of 0..7;
const
 shiftkeys: array [1..3] of TShiftKeyInfo = ((shift: Ord(ssCtrl); vkey: VK_CONTROL), (shift: Ord(ssShift); vkey: VK_SHIFT),(shift: Ord(ssAlt); vkey: VK_MENU));
var
 flag: DWORD;
 bShift: ByteSet absolute shift;
 j: Integer;
begin
 for j := 1 to 3 do
   begin
    if shiftkeys[j].shift in bShift then keybd_event(shiftkeys[j].vkey, MapVirtualKey(shiftkeys[j].vkey, 0), 0, 0);
   end;

 if specialkey then flag := KEYEVENTF_EXTENDEDKEY
 else flag := 0;

 keybd_event(key, MapvirtualKey(key, 0), flag, 0);
 flag := flag or KEYEVENTF_KEYUP;
 keybd_event(key, MapvirtualKey(key, 0), flag, 0);

 for j := 3 downto 1 do
   begin
    if shiftkeys[j].shift in bShift then keybd_event(shiftkeys[j].vkey, MapVirtualKey(shiftkeys[j].vkey, 0), KEYEVENTF_KEYUP, 0);
   end;
end;

wywołanie

procedure TForm1.SpeedButton1Click(Sender: TObject) ;
begin
{
Virutalne kody klawiszy +
ssCtrl
ssAlt
ssShift
}
// Simulate PRINTSCREEN - snapshot of the full screen
PostKeyEx32(VK_SNAPSHOT, [], False);

// Simulate PRINTSCREEN - snapshot of the active window
PostKeyEx32(VK_SNAPSHOT, [ssAlt], False);

// Simulate left Windows key
PostKeyEx32(VK_LWIN, [], False);

// Simulate Alt+F4 - close active window
PostKeyEx32(VK_F4, [ssAlt], False);
end;
0

OPI wez zrob z tego ARTYKUŁ albo do FAQ z tym -- NICE

1 użytkowników online, w tym zalogowanych: 0, gości: 1