Копирование выделенного текста в буфер обмена
Необходимо сделать так, что бы пользователь нажав назначенную в мой программе "горячую клавишу" и удерживая ее получил выделенный текст из буфера. Т.е. пользователь нажимает скажем Shift и держит, программа копирует выделенный текст и выдает его на экран.
Сейчас для копирования выделенного текста в буфер делается так:
procedure ClearShiftState;
begin
if GetKeyState(VK_SHIFT)
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
if GetKeyState(VK_CONTROL)
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
if GetKeyState(VK_MENU)
keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
end;
procedure CopySelectionFromActiveWindow;
var
Wnd: THandle;
begin
Wnd := GetFocusedControl;
if Wnd
begin
ClearShiftState;
keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event(Ord('C'), 0, 0, 0);
keybd_event(Ord('C'), 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
end;
end;
Т.е. фактически эмулируется нажатие Ctrl+C+C. При этом, если "горячая клавиша" Ctrl то все работает прекрасно, если же сменить "горячую клавишу", например на Shift то не работает. Возможно причина в том, что в момент эмуляции нажатия Ctrl+C+C, Shift уже нажат. Необходимо как-то это обойти. При этом необходимо учитывать, что нужно уметь получать слово из любого контрола где в принципе возможно выделение текста, будь то Word, Excel, FireFox, Opera или The Bat.
Приведенный выше код не обязательно должен присутствовать в вашей реализации, это просто пример.