![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нажать Enter
Pavelnk © (2015-07-29 18:11:00)Пишу маленькую прожку-помощник для себя. Как выставить мышку в нужное место я разобрался, как заставить её кликнуть, тоже -
mouse_event(MOUSEEVENTF_LEFTDOWN, p.X, p.Y, 0, 0);
Как мне теперь программно нажать Enter?
Игорь Шевченко (2015-07-30 10:25:00) [1]Pavelnk © (29.07.15 22:55) [9]
Это платная услуга
Pavelnk (2015-07-29 22:55:00) [2]> Игорь Шевченко © (29.07.15 22:23) [8]
Да, поставил sleep(170); всё заработало. Вот только один вопрос остался, как точку нажать? Вот так не хочет -
keybd_event(ord('.'), 0, 0, 0);
keybd_event(ord('.'), 0, KEYEVENTF_KEYUP, 0);
sleep(170);
Игорь Шевченко (2015-07-29 22:23:00) [3]Я неспециальные кнопки нажимал иначе:
procedure PlayKey(const C: Char);
var
Inputs: array[0..1] of TInput;
begin
if C <> '_' then
begin
FillChar(Inputs, SizeOf(Inputs), 0);
Inputs[0].Itype := INPUT_KEYBOARD;
Inputs[0].ki.wVk := Ord(C);
Inputs[0].ki.dwFlags := KEYEVENTF_EXTENDEDKEY;
Inputs[1].Itype := INPUT_KEYBOARD;
Inputs[1].ki.wVk := Ord(C);
Inputs[1].ki.dwFlags := KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP;
SendInput(2, TInput((@Inputs)^), SizeOf(TInput));
end
else
begin
keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event(VK_OEM_MINUS, 0, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event(VK_OEM_MINUS, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end;
end;
ВладОшин (2015-07-29 21:39:00) [4]еще лучше через MapVirtualKey(, а не просто 0
procedure TfrmSnils.PressThisKey(Key: Char);
var
VK: Byte;
begin
case Key of
'-': VK := $6D;
#08: VK := VK_BACK;
else VK := Ord(UpCase(Key));
end;
Application.ProcessMessages;
keybd_event(VK, MapVirtualKey(VK,0), 0, 0);
Application.ProcessMessages;
keybd_event(VK, MapVirtualKey(VK,0), KEYEVENTF_KEYUP, 0);
Application.ProcessMessages;
end;
procedure TfrmSnils.TypeThisStr(S: string);
var
i: Integer;
begin
for i := 1 to Length(s) do
begin
PressThisKey(s[i]);
Application.ProcessMessages;
end;
end;
Игорь Шевченко (2015-07-29 21:21:00) [5]попробуй вставить задержку между нажатием клавиш в 100 мс
Pavelnk (2015-07-29 19:27:00) [6]> Игорь Шевченко © (29.07.15 19:19) [4]
> потому что у тебя ошибка в коде
Почему ошибка? Всё вместе должно быть примерно так -
SetCursorPos(p.X, p.Y);
mouse_event(MOUSEEVENTF_LEFTDOWN, p.X, p.Y, 0, 0);
keybd_event(ord('D'), 0, 0, 0); //первая буква
keybd_event(ord('D'), 0, KEYEVENTF_KEYUP, 0);
keybd_event(ord('G'), 0, 0, 0); //вторая буква
keybd_event(ord('G'), 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_RETURN,0,KEYEVENTF_EXTENDEDKEY,0);
keybd_event(VK_RETURN,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
Игорь Шевченко (2015-07-29 19:19:00) [7]
> И ещё вопрос, почему я не могу ввести несколько букв подряд?
потому что у тебя ошибка в коде
Pavelnk (2015-07-29 19:09:00) [8]> Игорь Шевченко © (29.07.15 19:00) [2]
Да, спасибо! И ещё вопрос, почему я не могу ввести несколько букв подряд?
> keybd_event(ord('D'), 0, 0, 0);
> keybd_event(ord('D'), 0, KEYEVENTF_KEYUP, 0);
Если одна, то всё нормально. Фокус что ли теряется?
Игорь Шевченко (2015-07-29 19:00:00) [9]keybd_event(VK_RETURN, 0, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event(VK_RETURN, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
Pavelnk (2015-07-29 18:12:00) [10]В смысле вроде как с клавиатуры.