Конференция "Начинающим" » Буфер клавиатуры
 
  • СанСаныч (20.04.17 11:37) [0]
    Здравствуйте мастера! Хочу сделать по хоткеям быстрый набор команд в игре. Есть поле ввода, но набирать по буквенно эмулируя нажатия клавиш это долго... Можно как-то передать сразу всю строку(команду) в буфер клавиатуры?
  • СанСаныч (20.04.17 11:37) [1]
    нашел тут ссыль: http://www.swissdelphicenter.ch/de/showcode.php?id=220 но там тоже все побуквенно.. ((
  • DayGaykin © (20.04.17 11:39) [2]

    > СанСаныч   (20.04.17 11:37) 

    Делай по-буквенно, не парься. Поставь sleep поменьше.
    P.S. Читер ))
  • СанСаныч (20.04.17 15:26) [3]
    Побуквенно сделал, работает, но медленно.. (( вообче без sleep причем
    Как строку передать сразу или это невозможно?
  • DayGaykin © (20.04.17 17:45) [4]
    Покажи скрин поля ввода
  • СанСаныч (21.04.17 10:19) [5]
    Поле ввода обычный Edit, PrtScr не пашет почему-то в игре.. ((
  • СанСаныч (21.04.17 10:23) [6]
    вот нашел в сети, выложил тут: http://savepic.ru/13644082.jpg
    в красной рамке поле ввода данных, это звездная система..
  • СанСаныч (21.04.17 10:24) [7]
    Игра "Elite dangerous", окно карты галактики
  • СанСаныч (21.04.17 10:31) [8]
    Делаю справочник звездных системы, для быстрого выбора нужной системы и построения торгового маршрута. По хоткею целевая система вводится автоматом в поле ввода поиска. Есть пару популярных систем и станций ввиду больших наград за доставку грузов на которые часто летают торговые корабли
  • manaka © (21.04.17 11:40) [9]
    А зачем, чтобы сделать "быстрый набор команд" надо передавать что-то в буфер клавиатуры?
  • СанСаныч (21.04.17 11:46) [10]
    >manaka  как заполнить поле ввода не эмулируя побуквенно нажатия клавиш? я думал можно в буфер закинуть всю строку сразу..
  • manaka © (21.04.17 12:00) [11]
    А, дошло. в чужую прогу вставить.
  • СанСаныч (21.04.17 12:08) [12]
    >manaka Да )) побуквенно вставляет через keyb_event, но долго, хочу быстрее, сразу строку если можно..
  • Игорь Шевченко © (21.04.17 14:11) [13]
    СанСаныч   (21.04.17 12:08) [12]

    Научись набирать на клавиатуре одной строкой за нажатие. Если целевое приложение поддерживает clipboard, то WM_COPY|WM_PASTE возможно помогут.
  • СанСаныч (21.04.17 14:34) [14]
    Как одно у строкой за нажатие? Возможность вставки из буфера
    не проверял, гляну... Это идея! ))
  • kilkennycat © (21.04.17 16:18) [15]

    > СанСаныч   (21.04.17 14:34) [14]
    > Как одно у строкой за нажатие?

    ну, раз хочется сразу строку реализовать через клавиатуру, то значит, можно и за одно нажатие, скажем, в блокноте, набрать строку. Рекомендуется проделывать начиная со строки приветмир, так как стразу все 10 пальцев использовать поначалу трудновато.
  • СанСаныч (21.04.17 21:24) [16]
    WM_COPY|WM_PASTE отлично работают, большое спасибо за полезные советы!!!
  • manaka © (21.04.17 22:04) [17]
    сидит вот человек, играет в игрушку. и ему лень потратить несколько секунд набрать слово на клавиатуре. он программу пишет. мдяяяяяяяяяя... )))
  • СанСаныч (21.04.17 23:25) [18]
    >manaka у программеров болезнь, все автоматизировать.. )) в справочнике много звездных систем с мудреными и длинными названиями, проще хоткей нажать чем долго и нудно вспоминать и вводить их..
  • СанСаныч (22.04.17 00:01) [19]
    всплыл странный баг, не вставляет слова в кирилице.. только латинские без проблем. пробовал на OnCreate формы добавить SetThreadLocale(1049) не помогло.. ((
  • СанСаныч (22.04.17 00:02) [20]
    подозреваю собака зарыта с кодировкой в буфере, но как разрулить пока не знаю.. наверно нужно вставлять юникодную строку в эдит игрушки
  • Kilkennycat © (22.04.17 01:06) [21]

    > роще хоткей нажать чем долго и нудно вспоминать и вводить
    > их..

    а хоткеи помнить???


    > не вставляет слова в кирилице..

    юникод
  • СанСаныч (22.04.17 09:54) [22]
    Тут все просто, хоткеи: 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;
  • СанСаныч (22.04.17 09:59) [23]
    Если просто в Винде скопировать текст в кирилице и вставлять через Ctrl+V тоже нет результата, независимо от раскладки клавиатуры. Чувство что идет перехват и фильтрация WM_PASTE...
  • СанСаныч (22.04.17 10:00) [24]
    но вручную вбить с клавы можно любой текст без проблем...
  • DayGaykin © (22.04.17 10:59) [25]
    А в самой игре можно выделить текст, скопировать в буфер, а затем вставить обратно?
    Если да, скопируй русские буквы, и проанализируй что в буфере и в каком формате.
  • СанСаныч (22.04.17 11:06) [26]
    Выделить и скопировать текст в поле ввода к сожалению нельзя, работает только Ctrl+V
  • СанСаныч (22.04.17 11:09) [27]
    Но если в буфере латиница и кирилица вместе, вставит только латиницу.
    Уже пробовал и так:

    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);  

    результат нулевой.. ((
  • DayGaykin © (22.04.17 12:52) [28]

    > СанСаныч   (22.04.17 11:09) [27]

    "Вручную" тоже не выходит на разных раскладках?
  • СанСаныч (22.04.17 14:00) [29]
    Только в таком варианте заработало:

     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);

    вставляет смесь чего хочешь, латиницу и кирилицу вместе взятые.. ))
 
Конференция "Начинающим" » Буфер клавиатуры
Есть новые Нет новых   [118241   +24][b:0][p:0.001]