OberonCore https://forum.oberoncore.ru/ |
|
blackbox как перехватчик клавиатуры https://forum.oberoncore.ru/viewtopic.php?f=23&t=6328 |
Страница 1 из 1 |
Автор: | adva [ Четверг, 13 Декабрь, 2018 09:42 ] |
Заголовок сообщения: | blackbox как перехватчик клавиатуры |
Можно такое реализовать? По сути надо, чтобы перехватывались клавиши не только в bb, но и для других программ. Аналог autohotkey, но если есть такая возможность, хочу на bb свои скрипты для обработки писать |
Автор: | SovietPony [ Четверг, 13 Декабрь, 2018 12:57 ] |
Заголовок сообщения: | Re: blackbox как перехватчик клавиатуры |
Из коробки точно не получится. Без winapi тут не обойтись. |
Автор: | Илья Ермаков [ Четверг, 13 Декабрь, 2018 13:18 ] |
Заголовок сообщения: | Re: blackbox как перехватчик клавиатуры |
Вот модуль, который из 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 --- |
Автор: | Trurl [ Четверг, 13 Декабрь, 2018 14:20 ] |
Заголовок сообщения: | Re: blackbox как перехватчик клавиатуры |
adva писал(а): По сути надо, чтобы перехватывались клавиши не только в bb, но и для других программ. Тут дело осложняется тем, что обработчик должен быть в DLL и как-то надо организовать межпроцессное взаимодействие. |
Автор: | adva [ Четверг, 13 Декабрь, 2018 14:22 ] |
Заголовок сообщения: | Re: blackbox как перехватчик клавиатуры |
Спасибо. А у action какие ограничения (в плане времени)? Подобным кодом можно будет отловить нажатия всех клавиш? |
Автор: | adva [ Четверг, 13 Декабрь, 2018 14:26 ] |
Заголовок сообщения: | Re: blackbox как перехватчик клавиатуры |
Trurl писал(а): adva писал(а): По сути надо, чтобы перехватывались клавиши не только в bb, но и для других программ. Тут дело осложняется тем, что обработчик должен быть в DLL и как-то надо организовать межпроцессное взаимодействие. Вроде на текущем этапе не требуется: надо просто отловить нажатие клавиш, и на них послать свои нажатия клавиш (или мыши). |
Автор: | Илья Ермаков [ Четверг, 13 Декабрь, 2018 18:24 ] |
Заголовок сообщения: | Re: blackbox как перехватчик клавиатуры |
adva писал(а): Спасибо. А у action какие ограничения (в плане времени)? Подобным кодом можно будет отловить нажатия всех клавиш? Ну Акшн работает 20 раз в секунду - этого достаточно, чтобы ловить все нажатия. |
Автор: | Борис Рюмшин [ Четверг, 13 Декабрь, 2018 19:14 ] |
Заголовок сообщения: | Re: blackbox как перехватчик клавиатуры |
adva писал(а): ...Подобным кодом можно будет отловить нажатия всех клавиш? А не двойного ли применения технология? |
Автор: | adva [ Четверг, 20 Декабрь, 2018 10:29 ] |
Заголовок сообщения: | Re: blackbox как перехватчик клавиатуры |
Борис Рюмшин писал(а): adva писал(а): ...Подобным кодом можно будет отловить нажатия всех клавиш? А не двойного ли применения технология? Видимо двойного в итоге будет ) С перехватом клавы получилось. Спасибо, Илья. Но программа, которую хотел обрабатывать, написана на Qt5. Это MyTetra - неплохая кстати, база знаний, для личного использования (хотя если кто-то один заполняет, то просматривать можно всем), мне понравилась, поэтому и решил "допилить" для себя. Хотя там код открыт, но пишется на c++, поэтому хотел по простому, через посылку клавиш и работу с буфером. Как уже сказал, написана на Qt, а это приводит к тому, что никакие кнопки и дочерние окна по сути недоступны. Они открываются как равноправные окна у процесса, и имеют одинаковое название, если смотреть через winapi. Кто-то в инете написал, что, можно внедрится в процесс, чтобы отлавливать непосредственно вызовы процедур самой MyTetra. Как понял, это тоже можно делать с помощью winapi. В итоге у меня сейчас 2 решения: либо допиливать саму MyTetra, для чего придется изучать C++. Либо попробовать освоить инжект в процесс. Пока не знаю, что легче, но для себя решил, что полезнее второе, т.к. автоматизировать может понадобится и другую программу, и она тоже может оказаться на qt, но при этом без исходных кодов. Кто-нибудь уже пробовал используя BlackBox внедряться в другие процессы? Вроде Петр делал подобное, но если, я правильно помню, то меж процессами BlackBox. И может там другая технология. |
Автор: | Илья Ермаков [ Четверг, 20 Декабрь, 2018 14:04 ] |
Заголовок сообщения: | Re: blackbox как перехватчик клавиатуры |
Но у них порядок при обходе через WinApi всё равно должен быть фиксированный. Как-то можно добраться до нужного элемента, скорее всего. |
Автор: | Trurl [ Четверг, 20 Декабрь, 2018 14:48 ] |
Заголовок сообщения: | Re: blackbox как перехватчик клавиатуры |
У Qt нет окон в смысле Windows. Обходить через WinApi нечего. |
Автор: | adva [ Четверг, 20 Декабрь, 2018 15:01 ] |
Заголовок сообщения: | Re: blackbox как перехватчик клавиатуры |
Хотя наверное как вариант, можно попробовать искать по картинке кнопки. Иконок там сравнительно мало, может быть будет сравнительно быстро, как минимум всегда можно ограничится верхом главного окна, правда ни разу такое не реализовывал, но думаю это будет проще в плане реализации, чем инжектится, и в принципе должно подойти, для любой программы. |
Автор: | adva [ Пятница, 21 Декабрь, 2018 08:47 ] |
Заголовок сообщения: | Re: blackbox как перехватчик клавиатуры |
Нашел также еще одно решение. Которое создает иерархию окон приложения на 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. |
Автор: | Alexander Shiryaev [ Пятница, 21 Декабрь, 2018 11:27 ] |
Заголовок сообщения: | Re: blackbox как перехватчик клавиатуры |
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. |
Автор: | adva [ Пятница, 21 Декабрь, 2018 15:28 ] |
Заголовок сообщения: | Re: blackbox как перехватчик клавиатуры |
Спасибо. С ходу не понял, этот код внедряется в стороннюю программу, или просто перехватывает? |
Автор: | Alexander Shiryaev [ Пятница, 21 Декабрь, 2018 17:54 ] |
Заголовок сообщения: | Re: blackbox как перехватчик клавиатуры |
Нужно сделать DLL (выше приведён её исходный текст в качестве примера) и использовать её в своей программе. Я точно не знаю, как всё это работает, и написал про мой работающий вариант. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |