WM_COPY/EM_SETSEL в 3D/Chrome

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Kotaries, 27 Mar 2015.

  1. Kotaries

    Kotaries New Member

    Joined:
    6 Dec 2011
    Messages:
    2
    Likes Received:
    1
    Reputations:
    0
    Доброе время суток, ачат.

    Заморочился созданием программы по принципу "punto switcher", но столкнулся с грустной проблемой.
    Чтобы изменять вводимый пользователем текст (переводить "ghbdtn" в "привет") поступаю по-варварски:
    1. ставлю глобальный хук на пробел (VK_SPACE)
    2. при его нажатии отправляю в тот_элемент_с_которым_работает_юзер сообщение EM_SETSEL (выделить всё)
    3. затем отправляю WM_COPY (ну или WM_CUT) чтобы скопировать выделенный текст
    4. меняю содержимое буфера (clipboard.asText) на "исправленное"
    5. вставляю новое содержимое с помощью отправки WM_PASTE

    Но такой метод работает только с обычными приложениями, где есть собственно элемент типа TEdit или схожие. В игрушках 3D, и почему-то в браузере (Chrome) выделение/копирование/вставка не происходят. Сначала я думал, что неверно определяю HWND нужного контрола, но метод, по идее, должен быть универсален. Вот как оно работает:

    Code:
    ...
    var
        pgui:TGUITHREADINFO;
        hw,hwE:HWND;
    ...
    
    hw:=GetForegroundWindow; //активное окно с которым работает юзер
    pgui.cbSize:=SizeOf(TGUIThreadInfo);
    GetGUIThreadInfo(GetWindowThreadProcessId(hw,0),pgui);
    hwE:=pgui.hwndFocus; //тот контрол этого окна, в котором стоит фокус ввода клавиатуры (мигает курсор)
     if(hwE<=0) then hwE:=hw; //на всякий случай, если его нет, берем hwnd основного окна
    Подозреваю, что SendMessage заставить работать в 3Д игрушке (напр. WoW) не получится, т.к. там в принципе нет контролов и все поля ввода "нарисованные". Но должен ведь быть какой-то способ решить задачу?

    Пробовал использовать keybd_event - он слишком глючный, медленный и ненадежный, приходится ставить sleep после каждого нажатия/отжатия и все равно иногда тупит.
    Пробовал использоватьSendInput - он у меня работает примерно так же, как keybd_event, но лаговглюков еще больше. Мб, криво пробовал.

    Собсна, выручайте плз)
     
    #1 Kotaries, 27 Mar 2015
    Last edited: 27 Mar 2015
  2. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Быстрее SendInput ничего нет
     
  3. Kotaries

    Kotaries New Member

    Joined:
    6 Dec 2011
    Messages:
    2
    Likes Received:
    1
    Reputations:
    0
    проблема с сендинпутом и прочими эмуляциями - в том, что...
    что если я делаю через эмуляцию нажатия CTRL+A CTRL+C
    а потом читаю буфер clipboard.asText
    то в буфере, как мне кажется, не успевает появиться нужное мне значение
    а ставить задержку между эмуляцией и чтением из буфера - не вариант, ибо все нужно сделать быстро

    с sendMessage WM_Copy такого не было, мгновенно копировало все, и можно было сразу, обработав, вставить обратно =|
     
    #3 Kotaries, 27 Mar 2015
    Last edited: 29 Mar 2015
  4. Kotaries

    Kotaries New Member

    Joined:
    6 Dec 2011
    Messages:
    2
    Likes Received:
    1
    Reputations:
    0
    я не понимаю, как работает punto switcher
    он ведь тоже копирует, вырезает, переделывает, вставляет исправленное?
    или как... не понимаю. подскажите?