
We are searching data for your request:
Upon completion, a link will appear to access the found materials.
Бифаҳмед, ки чӣ тавр пайгирии фаъолияти мушро ҳатто агар барномаи Delphi ғайрифаъол бошад, дар панели нишаста бошад ё ягон UI надошта бошад.
Бо насб кардани як қалмоқе дар саросари система (ё глобалӣ) шумо метавонед корбарро бо муш назорат карда, мувофиқи он амал кунед.
Хук чист ва он чӣ гуна кор мекунад?
Ба таври кӯтоҳ, қалмоқе як функсияи (бозхарид) шумо метавонед ҳамчун як қисми DLL (китобхонаи пайванди динамикӣ) ё барномаи худ барои назорат кардани "рафтан" дар дохили системаи амалиётии Windows эҷод карда шавад.
2 намуди мошинҳо вуҷуд доранд - глобалӣ ва маҳаллӣ. Қалби маҳаллӣ рӯйдодҳоро танҳо барои барномаи муайян (ё ришта) назорат мекунад. Қалмоқе ҷаҳонӣ тамоми системаро назорат мекунад (ҳама риштаҳо).
Барои сохтани қалмоқеи глобалӣ ба шумо 2 лоиҳа лозим аст, 1 барои сохтани файли иҷрошаванда ва 1 барои DLL дорои тартиботи қалмоқ.
Мақолаи мо оид ба кор бо қалмоқҳои клавиатура аз Delphi мефаҳмонад, ки чӣ тавр ба ворид кардани клавиатура барои идоракунӣ, ки наметавонад диққати вурудро қабул кунад (ба мисли TImage).
Hooking муш
Бо тарроҳӣ, ҳаракати муш бо андозаи экрани мизи кории шумо маҳдуд карда мешавад (аз ҷумла Windows Task Bar). Вақте, ки шумо мушро ба канори чап / рост / боло / поёни ҳаракат медиҳед, он тавре ки интизор меравад, муш “истад” - тавре ки пешбинӣ шудааст (агар шумо як монитор надошта бошед).
Ин аст идеяи қалмоқе дар саросари система: Масалан, агар шумо мехоҳед, ки мушро ба тарафи рости экран ҳаракат кунед, вақте ки он ба канори чап ҳаракат мекунад (ва "ба он мерасад"), шумо метавонед қалмоқии глобалии мушро нависед барои ҷойгузин кардани нишоннамои муш.
Шумо аз сохтани лоиҳаи китобхонаи пайванди динамикӣ оғоз мекунед. DLL бояд ду усулро содир кунад: "HookMouse" ва "UnHookMouse".
Тартиби HookMouse даъват мекунад SetWindowsHookEx API барои параметри аввал аз "WH_MOUSE" мегузарад - Ҳамин тавр насб кардани тартиби қалмоқе, ки паёмҳои мушро назорат мекунад. Яке аз параметрҳои SetWindowsHookEx ин функсияи бозгардонидани Windows ҳангоми зангзании паёми муш аст, занг мезанад:
SetWindowsHookEx (WH_MOUSE, @HookProc, HInstance, 0);
Параметри охирин (value = 0) дар SetWindowsHookEx муайян мекунад, ки мо қалмоқаи глобалиро сабт мекунем.
HookProc паёмҳои марбут ба мушро таҳлил мекунад ва ба лоиҳаи санҷишии мо паёми махсус ("MouseHookMessage") мефиристад:
функсия HookProc (nCode: Integer; MsgID: WParam; Маълумот: LParam): LResult; stdcall;
var
мушPoint: TPoint;
notifyTestForm: мантиқӣ;
MouseDirection: TMouseDirection;
Оғоз
mousePoint: = PMouseHookStruct (маълумот) ^. pt;
notifyTestForm: = бардурӯғ;
агар (mousePoint.X = 0) баъд
Оғоз
Windows.SetCursorPos (-2 + Screen.Width, mousePoint.y);
notifyTestForm: = ҳақиқӣ;
Дастгирии MouseDirection: = mdRight;
Поён;
…
агар notifyTestForm баъд
Оғоз
PostMessage (FindWindow ('TMainHookTestForm', nil), MouseHookMessage, MsgID, Integer (MouseDirection));
Поён;
Натиҷа: = CallNextHookEx (Hook, nCode, MsgID, Data);
Поён;
Маслиҳат: Файлҳои Win32 SDK-ро хонед, то дар бораи сабти PMouseHookStruct ва имзои функсияи HookProc маълумот пайдо кунед.
Шарҳ: Функсияи қалмоқе ба ҳеҷ ҷое фиристодани чизе лозим нест - занги PostMessage танҳо барои нишон додани он, ки DLL бо ҷаҳони "берунӣ" муошират мекунад, истифода мешавад.
Ҳукси муш "гӯшкунанда"
Паёми "MouseHookMessage" ба лоиҳаи санҷишии шумо - форма бо номи "TMainHookTestForm" фиристода мешавад. Шумо усули WndProc-ро аз даст медиҳед, то ки паём гиред ва дар ҳолати зарурӣ амал кунед:
тартиби TMainHookTestForm.WndProc (var Хабар: TMessage);
Оғоз
мерос гирифтааст WndProc (паём);
агар Message.Msg = HookCommon.MouseHookMessage баъд
Оғоз
// татбиқ, ки дар коди ҳамроҳ пайдо шудааст
Сигнал (TMouseDirection (Message.LParam));
Поён;
Поён;
Албатта, вақте ки шакл сохта мешавад (OnCreate) шумо HookMouse-ро аз DLL даъват мекунед, вақте ки он баста мешавад (OnDestroy) шумо фармони UnHookMouse-ро мехонед.
Эзоҳ: Дастгоҳҳо одатан системаро суст мекунанд, зеро онҳо миқдори коркардро барои ҳар як паём зиёд мекунанд. Шумо бояд қалмоқро танҳо ҳангоми зарурат насб кунед ва ҳарчи зудтар онро хориҷ кунед.
боян
Лаҳзаи ҷолиб
the admirable message
Ташаккури зиёд барои тавзеҳот, акнун ман ба ин гуна хатогӣ роҳ намедиҳам.
Well done, the brilliant idea and is timely
Мебахшед, ки ман дахолат мекунам, аммо ман тавсия медиҳам, ки дигараш равам.