OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 10 Декабрь, 2019 06:06

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
 Заголовок сообщения: blackbox как перехватчик клавиатуры
СообщениеДобавлено: Четверг, 13 Декабрь, 2018 09:42 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 348
Откуда: Россия, Стерлитамак
Можно такое реализовать?
По сути надо, чтобы перехватывались клавиши не только в bb, но и для других программ.
Аналог autohotkey, но если есть такая возможность, хочу на bb свои скрипты для обработки писать


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 13 Декабрь, 2018 12:57 

Зарегистрирован: Воскресенье, 09 Декабрь, 2018 15:14
Сообщения: 54
Откуда: Equestria
Из коробки точно не получится. Без winapi тут не обойтись.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 13 Декабрь, 2018 13:18 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9163
Откуда: Россия, Орёл
Вот модуль, который из Action-а опрашивает состояние интересующих кнопок клавиатуры, а при нажатии ищет в чужой программе экранную кнопку и её нажимает.

История этого модуля: обратилась частная медклиника, у них в гинекологическом кабинете возникла проблема с цифровым кольпоскопом. Доктор должен прицелиться и навести резкость оптически, а потом развернуться к компу и мышкой тыкнуть кнопку "Получить снимок". Пока он поворачивается, резкость уплывает (кольпоскоп съезжает или цель дёргается).
В итоге взяли плату из клавиатуры, привязали к ней "курок", который прикрутили прямо к кольпоскопу, а на компе запустили вот этот модуль :)

Код:
StdCoder.Decode ..,, ..26,...3Qw7uP5PRPPNR9Rbf9b8R79FTvMf1GomCrlAy2xhX,Cb2x
 hXhC6FU1xhiZiVBhihgmRiioedhgrZcZRiXFfaqmSrtuGfa4700zdGrr8rmCLLCJuyKtYcZRiX
 7.2.s,MWX.0k,5TWyql.bnayKmKKqGomC5XzET1.PuP.MHT9N9ntumaU2,CJuyKtQC98P9PP7O
 NbXmb.2.wuEk2kb1V.2.cUGpmWLuOpoKqvCbHZiYpedhA704TeKKw.bHfEWUmL.6..D.n926.C
 cIhgsNHT9N9ntQ8qorG4704D.CbB,708T1U.k,v.T.rf12.,U,ot,U00.bnUGLu8ro8quGrmCL
 WKqtE0E.kHE.0.p.0.4E.6.JFA0z.U.2m,.jC.AU0KyB.,UgX.UO.,.16.c8.2UwK.616.dc.A
 U22.0EwE.8zzzzzB.6xzzzz5cuzzzzLaH.8D2V,UszzzzT72,6yk.E.Ozzzzz,uzzzzz,mzzzz
 z,eCY12UuzzzzT1.OD.uD.mD.eCw6c0kp.EG4.2.WMP9UERe0cUXDF9fR5uPPPP1fP7PNZvQRt
 IdHf.2UlbcZpC.c9h0E.8z,E.0.,F.2.o.6.K,4,0E.E2,cwR.0..o.6.K,K,yzayIWKJaKIEi
 ImmqoCrZyKq0rrCrRqk2aoa0pb8Je0mdKKtOroCqmCLK0mfaKr4IsaKK0GWaqkmqrSKK0Gayqn
 0GRqHECJuGKayqnmWHZiYRchZgnRbBgV7QcDpdHZeBAV7QggBhXRhEBgpRiZ3Yx2Ym2akQbBgV
 7YeN3e3hV7AV,RgoBhjphUgbU2eDBdCZe3JeUYeD3YGhc1xdGZcU2ZHhgm,umUCKua4H769eH7
 uCPM1OpU8p4ak20LtKqtCrmGKR0GVyobmoW4Ibin4ak2mqkCLuCIqaqlIbUYdDpd5BdCZevgV7
 A,HfPLPH9vQbPMDPNPdC,NEZeI1OK,dAfdB,tHB8658G1eIrN1H.ggYJ5.M1H6IZuH5OF7OJZO
 F,dL,tHRvENPO5nRqk20Jd.UIJitZddphfRbBg,.EI4KR0mUCKua4YcjRbBAV7oe,76ZPNCKK0
 GtKqt4KR0mYuIeKoXKIdin4Ic3xc7pdBAV7IiZRiX3Yug5jOORHsoZ5hgoBcnBjiRg9hgtReoB
 gohgcwedpBcJLuLZuETeHdeIT8HHtCPM0HcQAgUIbx22.D0...o8CJb4IcCJYyIeamRq.HeF,7
 8ZPNbvMmHE0nI0GH0GI851HS0GM6JFOFRO1Hk205C5,dCv76deIfOFPM0HMFNuI9O1HM0HMG2i
 mhgn,B76FtI91EeaqliqtWmI0mK0Gq4qtG566x7659PHXE,H76d8G.H6P1vQ.,dCvldKKt.Unl
 Rq.HM0TeP58PM1HM0KIbGoRA,05UuEX4IaCpWkW.GJtaLa.HkdKKtO56FT9H19R9fQFNMN76bO
 N.uqrSrIqk2KIb2Y2xhvM103.8puuKJin4aUKVVJbU.QbBAV0,cH9uJFNMHtCPM0C3.70..Erk
 Rqk26R7vEc9T8Q9fPduPT9P7OO11Ft7L8NNPOyGdCLtCqLiorm4SGK0mHGF01I01H0bH09H0LH
 01I01GRGsSGMTGsTGMRGMQGMEeXyYkvYkAZkzYkyYk,ZkuYkysD0H0TmIq.cIffPrN1P..2emB
 hiZi13hdZhYRiU2ZkBgmhgiZiu2YLBhi7Q2d,pd2Zd3BZvg,O3CKoeHES3.kR0GtKqteHEaIb.
 M0H6Rl9Rp761eI...30klWKEenSw8R1S2jOOR9NTvRF7Q1fQ69,tJHnUULxf13d7Zd2BZvUX,.
 MNEmklWKK0mfMEkf2dLpd2pc7JeHZedQ5we6BdAhcUQgc3YX2Yk2Y2xdBAV7AVAxhbpZ7phopc
 jJih3ZX3hg6HTHLWqmWrkGqmCqoqqkmKK0GMmGE8GE8GK0Gay4b9OTvR3OMbPNHtCP.ZXUIbx.
 UZ,7XIhgsZiL3ZX3BGLwGLK0GaKIbWGuWLuamK4nIin4EakdGLtaKrSKIGLwGbv2YAxhb7HRvC
 PM0Hkl.ME.6N2ZXVLlUUL,uoWWJeam4ak2k4akWuYU2emBBd1sCPM1.U4BhiZg13hdFEWGs44I
 5.W2U7pdUYiZ3joJbU.wd432M8p76jOO..PM0O3...0Gt..k2G5.I4.sCM1HM0VeI.gclZeZ3D
 ,78HdC,dET0.3OF.HcQ..SomUYFekf.dXg.kIqmM.ZOFdOJZeH,7Rl9R,ND,7R99Sqk2akWkW4
 LekRq.PEVK2kl.ME.6N2Zk,m0A6sJC2G2sM..K4YAQAw842w8F0B0.j09GICKo00aGEOWyhclZ
 eZFIaGE0GWU7QA..91G4.A6sJUC,MFQ58pW.59OPM09WUocdpBUvgVB..O28ouGLuyKr0GIaGR
 w8U6dHk4cJMP1POR99,tMFfC...HcQI5.EV.ghVBhi3YugbU.cFHfP7vJHHmEFGJXaKtCLuyJX
 yKtqKFmGE8GfKKtCroyKr0mMumM8mIin4aUX,kUkXK4YAghVBBNlfaa,,jmVEW.HeFCKo000Ge
 WoWU7QAEXa450WmlWKKIYnYkvYkkYkmYkxYkkYkDZkWAZBAV7UvM0H....sJ.K4uKmklkfMEkf
 .gV7.......91G4.A6sJ........K4YA.MEkf.......B0.EFGI0vH09I0vH09mIqU7.I8cHM1
 EEU0,in4q..6JZPSsOcE.mqoMN00.UcAZUQYU2avM0H.NPORvO6JF0AVgVB,2Yug53N37QE7gE
 7AH7A618VZ7VT8Vj7VN8V,VUwX2qX24YuYEi1y1.y18m4aU3Z7M0H...qF0LH09I01mUGMN.l7
 V,NE00.i1.UzUVIYBAV7cHi1Goo4Kqc9f8Q7PMdndGLtaab7PHfP.AZBAV3FEGJta5Q5P..Ydd
 phfxcpBgmZge2Ycoe,JeU2iVJiu2Y2BhV,VOMZP8rN182U7FzmqouaZ,U72iVJiiYgdRiVJggh
 gY3YuEe.K2P.0GaaKrw6sCPM1.UHhA7vENPOIZvgV7AVKVXdC.2d,,M0HcQkY.EV.QAEX..rN1
 A7CaUUU.M066sJu4QeZphYhdZRinVcQgclf.8oaypVmoYCoZmGE0HK2adQbBk2..MH9vQb13ON
 99QFdEH8Jb88PNAHN8PM0H.P.0mdK450iXB..yIrC2k2.sI9fP71g,9eHwdiR6sCqEVKoXUGhC
 PMFR8FiImm4L0oZBgV0QdYZhd,EdKLrqk48..kdKaY,8ssHpmsETfPdnrmKqKKtCLLCZYRcoJi
 gZcZRiX3Ulb8..umVyKrG5EWQiX3.5011o3cQ...sQR,.G20EtH.0.G,,6.M00U.2..AU0CyIh
 A8pumqm8rtumdcIf9PY62Ulb8.CLL8pumqmY62UmT.6.QJ,k1kFF.0U1CS.QiiQ8CJuaLqKKWK
 qt2Ul1.RVtZBE.8z16.0.E2Eh6.0.32.oZ,Zio,dX2tQ0U2U...GG.6.16.6.665hKE.4vl5UT
 yB4.4.0E.cUZT1E..UO.,.1.e0.,6Y1.0.UA2Tm.mmBjZ92T,eUXDFTXh,Cor..c2,.,..W.0.
 A,,UMSdn76Dtc0MyfU.az864T8O0OJW7,8....
 --- end of encoding ---


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 13 Декабрь, 2018 14:20 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1210
adva писал(а):
По сути надо, чтобы перехватывались клавиши не только в bb, но и для других программ.

Тут дело осложняется тем, что обработчик должен быть в DLL и как-то надо организовать межпроцессное взаимодействие.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 13 Декабрь, 2018 14:22 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 348
Откуда: Россия, Стерлитамак
Спасибо. А у action какие ограничения (в плане времени)? Подобным кодом можно будет отловить нажатия всех клавиш?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 13 Декабрь, 2018 14:26 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 348
Откуда: Россия, Стерлитамак
Trurl писал(а):
adva писал(а):
По сути надо, чтобы перехватывались клавиши не только в bb, но и для других программ.

Тут дело осложняется тем, что обработчик должен быть в DLL и как-то надо организовать межпроцессное взаимодействие.

Вроде на текущем этапе не требуется: надо просто отловить нажатие клавиш, и на них послать свои нажатия клавиш (или мыши).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 13 Декабрь, 2018 18:24 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9163
Откуда: Россия, Орёл
adva писал(а):
Спасибо. А у action какие ограничения (в плане времени)? Подобным кодом можно будет отловить нажатия всех клавиш?


Ну Акшн работает 20 раз в секунду - этого достаточно, чтобы ловить все нажатия.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 13 Декабрь, 2018 19:14 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4355
Откуда: Россия, Орёл
adva писал(а):
...Подобным кодом можно будет отловить нажатия всех клавиш?

А не двойного ли применения технология? 8) :mrgreen:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 20 Декабрь, 2018 10:29 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 348
Откуда: Россия, Стерлитамак
Борис Рюмшин писал(а):
adva писал(а):
...Подобным кодом можно будет отловить нажатия всех клавиш?

А не двойного ли применения технология? 8) :mrgreen:


Видимо двойного в итоге будет )

С перехватом клавы получилось. Спасибо, Илья.
Но программа, которую хотел обрабатывать, написана на Qt5. Это MyTetra - неплохая кстати, база знаний, для личного использования (хотя если кто-то один заполняет, то просматривать можно всем), мне понравилась, поэтому и решил "допилить" для себя. Хотя там код открыт, но пишется на c++, поэтому хотел по простому, через посылку клавиш и работу с буфером.

Как уже сказал, написана на Qt, а это приводит к тому, что никакие кнопки и дочерние окна по сути недоступны. Они открываются как равноправные окна у процесса, и имеют одинаковое название, если смотреть через winapi.

Кто-то в инете написал, что, можно внедрится в процесс, чтобы отлавливать непосредственно вызовы процедур самой MyTetra. Как понял, это тоже можно делать с помощью winapi.

В итоге у меня сейчас 2 решения: либо допиливать саму MyTetra, для чего придется изучать C++. Либо попробовать освоить инжект в процесс. Пока не знаю, что легче, но для себя решил, что полезнее второе, т.к. автоматизировать может понадобится и другую программу, и она тоже может оказаться на qt, но при этом без исходных кодов.

Кто-нибудь уже пробовал используя BlackBox внедряться в другие процессы? Вроде Петр делал подобное, но если, я правильно помню, то меж процессами BlackBox. И может там другая технология.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 20 Декабрь, 2018 14:04 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9163
Откуда: Россия, Орёл
Но у них порядок при обходе через WinApi всё равно должен быть фиксированный. Как-то можно добраться до нужного элемента, скорее всего.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 20 Декабрь, 2018 14:48 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1210
У Qt нет окон в смысле Windows. Обходить через WinApi нечего.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 20 Декабрь, 2018 15:01 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 348
Откуда: Россия, Стерлитамак
Хотя наверное как вариант, можно попробовать искать по картинке кнопки. Иконок там сравнительно мало, может быть будет сравнительно быстро, как минимум всегда можно ограничится верхом главного окна, правда ни разу такое не реализовывал, но думаю это будет проще в плане реализации, чем инжектится, и в принципе должно подойти, для любой программы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 21 Декабрь, 2018 08:47 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 348
Откуда: Россия, Стерлитамак
Нашел также еще одно решение. Которое создает иерархию окон приложения на Qt (не знаю, всех ли приложений, но как минимум, мне помогло). Правда класс окон везде по прежнему одинаковый, и их текст тоже, но тут уже можно исходя координат относительно друг друга вычислить, что за окно (у меня на win 10 сработало, при чём перезапускал только саму программу):

I ran into this problem when trying to hook up an automated GUI tool we have in house. The problem is due to the way QT emulates windowing. In order to see window handles in Spy++ (and various Windows API functions) you will need to add an environment variable:
(From Windows 8.1):
Go to Control Panel\System and Security\System\Advanced System Settings...
On the Advanced tab hit Environment Variables
Add a new variable with a name of QT_USE_NATIVE_WINDOWS and value of 1
For user variables you need to restart visual studio
For environment variables you may need to restart the machine
Once all of the above is done you should be able to use Spy++ to get the button handles.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 21 Декабрь, 2018 11:27 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 458
Откуда: Егорьевск
WinApi SetWindowsHookEx WH_KEYBOARD

Пример на Delphi 7:
Код:
library msdopcelhook;

(*
  Alexander Shiryaev, 2010.04.29

  Для обнаружения нажатий клавиш в другой программе
*)

{$OVERFLOWCHECKS ON}
{$RANGECHECKS ON}

uses Windows, Messages, SysUtils;

const
  DllName = 'dopcelhook';
  MemMapFile = DllName + '.memmapfile';
  trace = False;

type
  PDLLGlobal = ^TDLLGlobal;
  TDLLGlobal = packed record
    HookHandle: Windows.HHOOK;

    res: Integer;
    wParam: WPARAM;
    lParam: LPARAM
  end;

var
  GlobalData: PDLLGlobal;
  MMF: THandle;

function HookProc (code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
  if GlobalData <> nil then begin
    if code < 0 then begin
      Result := CallNextHookEx(GlobalData^.HookHandle, code, wParam, lParam)
    end else begin
      // MessageBox(0, PAnsiChar(IntToHex(wParam, 4)), '', MB_OK);
      (* TODO: wParam, lParam filter here *)
        GlobalData^.wParam := wParam;
        GlobalData^.lParam := lParam;
        GlobalData^.res := 0; (* data available *)
      Result := CallNextHookEx(GlobalData^.HookHandle, code, wParam, lParam)
    end
  end else begin
    Result := 0 (* FIXME *)
  end
end (* HookProc *);

procedure CreateGlobalHeap;
begin
  MMF := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0,
    SizeOf(TDLLGlobal), MemMapFile);

  if MMF <> 0 then begin
    GlobalData := MapViewOfFile(MMF, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TDLLGlobal));
    if GlobalData = nil then begin
      CloseHandle(MMF)
    end else begin
      (* FIXME *)
        // GlobalData^.HookHandle := INVALID_HANDLE_VALUE;
        GlobalData^.res := 3 (* no data available *)
    end
  end else begin
    GlobalData := nil
  end
end (* CreateGlobalHeap *);

procedure DeleteGlobalHeap;
begin
  if GlobalData <> nil then begin
    UnmapViewOfFile(GlobalData);

    GlobalData := nil;

    if MMF <> INVALID_HANDLE_VALUE then begin
      CloseHandle(MMF)
    end
  end
end (* DeleteGlobalHeap *);

procedure RunHook; stdcall;
begin
  if GlobalData <> nil then begin
    GlobalData^.HookHandle := SetWindowsHookEx(WH_KEYBOARD, @HookProc, HInstance, 0);
    if GlobalData^.HookHandle = INVALID_HANDLE_VALUE then begin
      MessageBox(0, 'RunHook: fail: SetWindowsHookEx', DllName, MB_OK)
    end else begin
      if trace then begin
        MessageBox(0, 'RunHook: ok', DllName, MB_OK)
      end
    end
  end else begin
    MessageBox(0, 'RunHook: fail: GlobalData = nil', DllName, MB_OK)
  end
end (* RunHook *);

procedure KillHook; stdcall;
begin
  if GlobalData <> nil then begin
    if GlobalData^.HookHandle <> INVALID_HANDLE_VALUE then begin
      UnhookWindowsHookEx(GlobalData^.HookHandle);
      GlobalData^.HookHandle := INVALID_HANDLE_VALUE;
      if trace then begin
        MessageBox(0, 'KillHook: ok', DllName, MB_OK)
      end
    end else begin
      MessageBox(0, 'KillHook: already killed', DllName, MB_OK)
    end
  end else begin
    MessageBox(0, 'KillHook: fail: GlobalData = nil', DllName, MB_OK)
  end
end (* KillHook *);

procedure Get (var wParam: WPARAM; var lParam: LPARAM; var res: Integer); stdcall;
begin
  if GlobalData <> nil then begin
    if GlobalData^.HookHandle <> INVALID_HANDLE_VALUE then begin
      if GlobalData^.res = 0 then begin
        wParam := GlobalData^.wParam;
        lParam := GlobalData^.lParam;
        // MessageBox(0, PAnsiChar('W:' + IntToHex(GlobalData^.wParam, 4) + ' L:' + IntToHex(GlobalData^.lParam, 4)), '', MB_OK)
      end;
      res := GlobalData^.res;
      GlobalData^.res := 4; (* no new data available *)
    end else begin
      res := 2 (* hook not runned *)
    end
  end else begin
    res := 1 (* memory control error *)
  end
end (* Get *);

procedure DLLEntry (dwReason: DWORD);
begin
  case dwReason of
  DLL_PROCESS_ATTACH:
    begin
      CreateGlobalHeap;
      // RunHook
    end;
  DLL_PROCESS_DETACH:
    begin
      // KillHook;
      DeleteGlobalHeap
    end;
  end
end (* DLLEntry *);

exports
  KillHook, RunHook, Get;

begin
  DllProc := @DLLEntry;
  DLLEntry(DLL_PROCESS_ATTACH)
end.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 21 Декабрь, 2018 15:28 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 348
Откуда: Россия, Стерлитамак
Спасибо. С ходу не понял, этот код внедряется в стороннюю программу, или просто перехватывает?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 21 Декабрь, 2018 17:54 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 458
Откуда: Егорьевск
Нужно сделать DLL (выше приведён её исходный текст в качестве примера) и использовать её в своей программе.
Я точно не знаю, как всё это работает, и написал про мой работающий вариант.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB