Chciałbym się dowiedzieć, jak mogę zasymulować skrót klawiaturowy dla konkretnej aplikacji działającej w tle?
Z góry dzięki
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;
OPI wez zrob z tego ARTYKUŁ albo do FAQ z tym -- NICE