Копирование выделенного текста в буфер обмена

Леонид19 лет в сервисе
Данные заказчика будут вам доступны после подачи заявки
27.12.2006

Необходимо сделать так, что бы пользователь нажав назначенную в мой программе "горячую клавишу" и удерживая ее получил выделенный текст из буфера. Т.е. пользователь нажимает скажем 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.

Приведенный выше код не обязательно должен присутствовать в вашей реализации, это просто пример.

Заявки фрилансеров