-
Здравствуйте мастера! Хочу сделать по хоткеям быстрый набор команд в игре. Есть поле ввода, но набирать по буквенно эмулируя нажатия клавиш это долго... Можно как-то передать сразу всю строку(команду) в буфер клавиатуры?
-
-
> СанСаныч (20.04.17 11:37)
Делай по-буквенно, не парься. Поставь sleep поменьше.
P.S. Читер ))
-
Побуквенно сделал, работает, но медленно.. (( вообче без sleep причем
Как строку передать сразу или это невозможно?
-
Покажи скрин поля ввода
-
Поле ввода обычный Edit, PrtScr не пашет почему-то в игре.. ((
-
-
Игра "Elite dangerous", окно карты галактики
-
Делаю справочник звездных системы, для быстрого выбора нужной системы и построения торгового маршрута. По хоткею целевая система вводится автоматом в поле ввода поиска. Есть пару популярных систем и станций ввиду больших наград за доставку грузов на которые часто летают торговые корабли
-
А зачем, чтобы сделать "быстрый набор команд" надо передавать что-то в буфер клавиатуры?
-
>manaka как заполнить поле ввода не эмулируя побуквенно нажатия клавиш? я думал можно в буфер закинуть всю строку сразу..
-
А, дошло. в чужую прогу вставить.
-
>manaka Да )) побуквенно вставляет через keyb_event, но долго, хочу быстрее, сразу строку если можно..
-
СанСаныч (21.04.17 12:08) [12]
Научись набирать на клавиатуре одной строкой за нажатие. Если целевое приложение поддерживает clipboard, то WM_COPY|WM_PASTE возможно помогут.
-
Как одно у строкой за нажатие? Возможность вставки из буфера
не проверял, гляну... Это идея! ))
-
> СанСаныч (21.04.17 14:34) [14]
> Как одно у строкой за нажатие?
ну, раз хочется сразу строку реализовать через клавиатуру, то значит, можно и за одно нажатие, скажем, в блокноте, набрать строку. Рекомендуется проделывать начиная со строки приветмир, так как стразу все 10 пальцев использовать поначалу трудновато.
-
WM_COPY|WM_PASTE отлично работают, большое спасибо за полезные советы!!!
-
сидит вот человек, играет в игрушку. и ему лень потратить несколько секунд набрать слово на клавиатуре. он программу пишет. мдяяяяяяяяяя... )))
-
>manaka у программеров болезнь, все автоматизировать.. )) в справочнике много звездных систем с мудреными и длинными названиями, проще хоткей нажать чем долго и нудно вспоминать и вводить их..
-
всплыл странный баг, не вставляет слова в кирилице.. только латинские без проблем. пробовал на OnCreate формы добавить SetThreadLocale(1049) не помогло.. ((
-
подозреваю собака зарыта с кодировкой в буфере, но как разрулить пока не знаю.. наверно нужно вставлять юникодную строку в эдит игрушки
-
> роще хоткей нажать чем долго и нудно вспоминать и вводить
> их..
а хоткеи помнить???
> не вставляет слова в кирилице..
юникод
-
Тут все просто, хоткеи: F1-F12(цифры по увеличению расстояния от базы(точки вылета)). По юникоду, вставляю строку в буфер используя такую функцию, но латиницу потом из буфера в игре вставляет, а кирилицу все-равно нет:
procedure StringToClipBoard(const Str: WideString);
var
Size: Integer;
Data: THandle;
DataPtr: Pointer;
begin
Size := Length(Str);
if Size = 0 then
exit;
if not IsClipboardFormatAvailable(CF_UNICODETEXT) then
Clipboard.AsText := Str
else
begin
Size := Size shl 1 + 2;
Data := GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, Size);
try
DataPtr := GlobalLock(Data);
try
Move(Pointer(Str)^, DataPtr^, Size);
Clipboard.SetAsHandle(CF_UNICODETEXT, Data);
finally
GlobalUnlock(Data);
end;
except
GlobalFree(Data);
raise;
end;
end;
end;
-
Если просто в Винде скопировать текст в кирилице и вставлять через Ctrl+V тоже нет результата, независимо от раскладки клавиатуры. Чувство что идет перехват и фильтрация WM_PASTE...
-
но вручную вбить с клавы можно любой текст без проблем...
-
А в самой игре можно выделить текст, скопировать в буфер, а затем вставить обратно?
Если да, скопируй русские буквы, и проанализируй что в буфере и в каком формате.
-
Выделить и скопировать текст в поле ввода к сожалению нельзя, работает только Ctrl+V
-
Но если в буфере латиница и кирилица вместе, вставит только латиницу.
Уже пробовал и так:
s:='бла-бла-бла';
Wnd:= GetForegroundWindow;
GuiInfo.cbSize:=SizeOf(TGUIThreadInfo);
GetGUIThreadInfo(GetWindowThreadProcessId(Wnd),GuiInfo);
LoadKeyboardLayout('00000419', 1);
Clipboard.AsText := s;
SendMessage(GuiInfo.hwndFocus, WM_SETTEXT, 0, integer(pChar(s)));
и так тоже:
PostMessage(GuiInfo.hwndFocus, WM_PASTE, 0, 0);
результат нулевой.. ((
-
> СанСаныч (22.04.17 11:09) [27]
"Вручную" тоже не выходит на разных раскладках?
-
Только в таком варианте заработало:
vGuiInfo.cbSize:=SizeOf(TGUIThreadInfo);
GetGUIThreadInfo(GetWindowThreadProcessId(GetForegroundWindow),vGuiInfo);
ah:=vGuiInfo.hwndFocus;
if ah>0 then
for i := 1 to Length(s) do SendMessage(ah, wm_char, ord(s[i]), 0);
вставляет смесь чего хочешь, латиницу и кирилицу вместе взятые.. ))