Форум: "Начинающим";
Текущий архив: 2012.01.01;
Скачать: [xml.tar.bz2];
ВнизИмитация нажатия клавиш Найти похожие ветки
← →
я (2011-09-27 06:07) [0]
function KeyboardInput(InputWord:string):boolean;
begin
if (InputWord ="SHIFT+END") then
begin
keybd_event(VK_LSHIFT, 0, 0, 0);
keybd_event(VK_END, 0, 0, 0);
sleep(random(500));
keybd_event(VK_END, 0, KEYEVENTF_KEYUP, 0);
sleep(random(500));
keybd_event(VK_LSHIFT, 0, KEYEVENTF_KEYUP, 0);
sleep(random(1200));
end
else
if (InputWord ="END") then
Begin
keybd_event(VK_END, 0, 0, 0);
sleep(random(500));
keybd_event(VK_END, 0, KEYEVENTF_KEYUP, 0);
End
else
if (InputWord ="HOME") then
begin
keybd_event(VK_Home, 0, 0, 0);
keybd_event(VK_Home, 0, KEYEVENTF_KEYUP, 0);
end
else
if (InputWord ="DELETE") then
begin
keybd_event(VK_Delete, 0, 0, 0);
sleep(random(300));
keybd_event(VK_Delete, 0, KEYEVENTF_KEYUP, 0);
end
result:=true;
end;
есть такая процедура, которая должна эмулировать нажатие кнопок.
Далее при активном поле неизвестного класса, но работающего как Edit начинаем вызывать функцию в следующей последовательности:
.....
KeyboardInput("HOME");
KeyboardInput("SHIFT+END");
KeyboardInput("DELETE");
.....
Я пытаюсь этим добиться того, чтобы сначала произошел переход в начало строки - и на сколько я могу судить это происходит. Затем вторым вызовом строка должна выделится, а курсор перейти в конец строки. И далее строка удаляется третим вызовом.
А на практике выходит. Что курсор уходит в начало, потом в конец, но строка при этом не выделяется. Где косяк?
← →
я (2011-09-27 06:10) [1]да, если делать вручную то же самое с реальной клавиатуры, то проблем нет. Кроме того случается так, что после пробегания по этому коду Вдруг сбрасывается фокус с редактируемого поля - чтобы это такое могло быть?
Ну разве что еще перед этими тремя действиями вызывается подобное, но по кликанью мышкой в этом поле, чтобы ему фокус передать.
← →
Омлет © (2011-09-27 07:57) [2]Для VK_END нужен ещё флаг KEYEVENTF_EXTENDEDKEY.
← →
Омлет © (2011-09-27 08:15) [3]
const
ExtendedKeys: set of Byte = [
VK_LBUTTON, VK_RBUTTON, VK_CANCEL, VK_MBUTTON, VK_BACK, VK_TAB, VK_CLEAR,
VK_RETURN, VK_SHIFT, VK_CONTROL, VK_MENU, VK_PAUSE, VK_CAPITAL, VK_KANA,
VK_HANGUL, VK_JUNJA, VK_FINAL, VK_HANJA, VK_KANJI, VK_ESCAPE,
VK_CONVERT, VK_NONCONVERT, VK_ACCEPT, VK_MODECHANGE, VK_SPACE, VK_PRIOR, VK_NEXT,
VK_END, VK_HOME, VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN, VK_SELECT, VK_PRINT, VK_EXECUTE,
VK_SNAPSHOT, VK_INSERT, VK_DELETE, VK_HELP, VK_LWIN, VK_RWIN, VK_APPS, VK_NUMPAD0,
VK_NUMPAD1, VK_NUMPAD2, VK_NUMPAD3, VK_NUMPAD4, VK_NUMPAD5, VK_NUMPAD6,
VK_NUMPAD7, VK_NUMPAD8, VK_NUMPAD9, VK_MULTIPLY, VK_ADD, VK_SEPARATOR,
VK_SUBTRACT, VK_DECIMAL, VK_DIVIDE, VK_F1, VK_F2, VK_F3, VK_F4, VK_F5, VK_F6, VK_F7,
VK_F8, VK_F9, VK_F10, VK_F11, VK_F12, VK_F13, VK_F14, VK_F15, VK_F16, VK_F17, VK_F18,
VK_F19, VK_F20, VK_F21, VK_F22, VK_F23, VK_F24, VK_NUMLOCK, VK_SCROLL, VK_LSHIFT,
VK_RSHIFT, VK_LCONTROL, VK_RCONTROL, VK_LMENU, VK_RMENU, VK_PROCESSKEY, VK_ATTN,
VK_CRSEL, VK_EXSEL, VK_EREOF, VK_PLAY, VK_ZOOM, VK_NONAME, VK_PA1, VK_OEM_CLEAR
];
procedure SendKeyInput(AKey: Byte; IsKeyUp: boolean = false);
var
Input: TInput;
begin
Input.Itype := INPUT_KEYBOARD;
with Input.ki do
begin
wVk := AKey;
if AKey in ExtendedKeys then
dwFlags := KEYEVENTF_EXTENDEDKEY;
if IsKeyUp then
dwFlags := dwFlags or KEYEVENTF_KEYUP;
time := 0;
dwExtraInfo := 0;
end;
SendInput(1, Input, SizeOf(Input));
end;
procedure TForm1.AmGo;
begin
SendKeyInput(VK_HOME);
SendKeyInput(VK_HOME, true);
SendKeyInput(VK_LSHIFT);
SendKeyInput(VK_END);
SendKeyInput(VK_END, true);
SendKeyInput(VK_LSHIFT, true);
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
edt1.SetFocus;
AmGo;
end;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.01.01;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.003 c