Niczym się to nie różni — jedno i drugie daje dokładnie to samo. Na pewno jedyną wprowadzoną w kodzie zmianą było wrzucenie VK_DOWN
do zmiennej? W jednym ze swoich projektów (Free Pascal) używałem takiej funkcji:
procedure BroadcastShortcut(AKey: UInt16; AShift: TShiftState);
begin
if ssShift in AShift then Windows.keybd_event(VK_SHIFT, MapVirtualKey(VK_SHIFT, 0), 0, 0);
if ssAlt in AShift then Windows.keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), 0, 0);
if ssCtrl in AShift then Windows.keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
Windows.keybd_event(AKey, MapVirtualKey(AKey, 0), 0, 0);
Windows.Sleep(100);
Windows.keybd_event(AKey, MapVirtualKey(AKey, 0), KEYEVENTF_KEYUP, 0);
if ssCtrl in AShift then Windows.keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);
if ssAlt in AShift then Windows.keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), KEYEVENTF_KEYUP, 0);
if ssShift in AShift then Windows.keybd_event(VK_SHIFT, MapVirtualKey(VK_SHIFT, 0), KEYEVENTF_KEYUP, 0);
end;
Nie było żadnych problemów z wysyłaniem klawiszy i całych skrótów — ani w WinXP, ani w Win7, ani w Win10. Tzn. były, bo np. OBS nie zdążał złapać skrótu zanim został on ”wyciśnięty”, więc dodałem Sleep
i po problemie.