<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=276828&amp;view=findpost&amp;p=2309841</guid>
        <pubDate>Sun, 12 Jul 2009 12:42:37 +0000</pubDate>
        <title>Подсунуть ловушке метод вместо функции.</title>
        <link>https://forum.sources.ru/index.php?showtopic=276828&amp;view=findpost&amp;p=2309841</link>
        <description><![CDATA[ViktorXP: хотя можна и глобально поцепить (но без переменной всеравно не обойтись. хотя изврат получается приколькный (может комуто и пригодится ))) ))<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">library Project2;</div><div class="code_line">&nbsp;</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;Windows, Messages,</div><div class="code_line">&nbsp;&nbsp;UHook in &#39;UHook.pas&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TTestOb = class(TObject)</div><div class="code_line">&nbsp;&nbsp;private</div><div class="code_line">&nbsp;&nbsp; &nbsp;Hook: PHookMetod;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure GKeyboard(var Msg: TMessage);</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;constructor Create;</div><div class="code_line">&nbsp;&nbsp; &nbsp;destructor Destroy; override;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Test: TTestOb;</div><div class="code_line">&nbsp;</div><div class="code_line">{ TTestOb }</div><div class="code_line">&nbsp;</div><div class="code_line">constructor TTestOb.Create;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Hook := MethodMakeToCall(GKeyboard);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">destructor TTestOb.Destroy;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;FreeCall(Hook);</div><div class="code_line">&nbsp;&nbsp;inherited;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TTestOb.GKeyboard(var Msg: TMessage);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;MessageBeep(0);</div><div class="code_line">&nbsp;&nbsp;Msg.Result := 1; // блокируем все ))))</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure CallHook;</div><div class="code_line">asm</div><div class="code_line">&nbsp;&nbsp;push eax</div><div class="code_line">&nbsp;&nbsp;push eax</div><div class="code_line">&nbsp;&nbsp;mov eax, Test</div><div class="code_line">&nbsp;&nbsp;mov eax, [eax].TTestOb.Hook;</div><div class="code_line">&nbsp;&nbsp;mov [esp+4], eax</div><div class="code_line">&nbsp;&nbsp;pop eax</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function Start: HHOOK;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := SetWindowsHookEx(WH_KEYBOARD, @CallHook, HInstance, 0);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure DLLEntryPoint(dwReason: DWord); stdcall;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;case dwReason of</div><div class="code_line">&nbsp;&nbsp; &nbsp;DLL_PROCESS_ATTACH: Test := TTestOb.Create;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DLL_PROCESS_DETACH: Test.Free;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">exports</div><div class="code_line">&nbsp;&nbsp;start;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;DLLProc:= @DLLEntryPoint;</div><div class="code_line">&nbsp;&nbsp;DLLEntryPoint(DLL_PROCESS_ATTACH);</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script> ну и тест.<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">function Start: HHOOK; stdcall; &nbsp;external &#39;Project2.dll&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">{$R *.dfm} &nbsp; &nbsp; &nbsp; &nbsp; </div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;H: THandle;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.FormCreate(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;H := Start;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.FormDestroy(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;UnhookWindowsHookEx(H)</div><div class="code_line">end;</div></ol></div></div></div></div> естественно нужно позаботится о глобальной передачи хендла ловушки, но это к данному примеру не относится.]]></description>
        <author>ViktorXP</author>
        <category>Системные функции, WinAPI, работа с железом</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=276828&amp;view=findpost&amp;p=2309727</guid>
        <pubDate>Sun, 12 Jul 2009 11:35:48 +0000</pubDate>
        <title>Подсунуть ловушке метод вместо функции.</title>
        <link>https://forum.sources.ru/index.php?showtopic=276828&amp;view=findpost&amp;p=2309727</link>
        <description><![CDATA[ViktorXP: Бывает неудобно использовать локальную ловушку в объектной программе. Для того чтобы взаимодействавать с обектом нужно гдето хранить глобальную переменную под этот объект. а бывают такие случаи когда это  затруднительно зделать (и тогда начинаются извращения);<br>
<br>
я для себя набросал модуль который позволяет метод подсунуть SetWindowsHookEx <br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;TForm1 = class(TForm)</div><div class="code_line">..</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure FormCreate(Sender: TObject);</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure FormDestroy(Sender: TObject);</div><div class="code_line">&nbsp;&nbsp;private</div><div class="code_line">&nbsp;&nbsp; &nbsp;Hook: HHOOK;</div><div class="code_line">&nbsp;&nbsp; &nbsp;HookMetod: PHookMetod;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure GKeyboard(var Kbd: TKeyboard);</div><div class="code_line">...</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.FormCreate(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;HookMetod := MethodMakeToCall(GKeyboard); </div><div class="code_line">&nbsp;&nbsp;hook := SetWindowsHookEx(WH_KEYBOARD, HookMetod, HInstance, GetCurrentThreadId);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.FormDestroy(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;UnhookWindowsHookEx(hook);</div><div class="code_line">&nbsp;&nbsp;FreeCall(HookMetod);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.GKeyboard(var msg: TMessage);</div><div class="code_line">begin</div><div class="code_line">....</div><div class="code_line">end;</div></ol></div></div></div></div> Но было лень хранить две переменных посему я набросал оболочку над SetWindowsHookEx<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">...</div><div class="code_line">&nbsp;&nbsp;private</div><div class="code_line">&nbsp;&nbsp; &nbsp;Hook: PHookMetod;</div><div class="code_line">...</div><div class="code_line">procedure TForm1.FormCreate(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;hook := SetHook(WH_KEYBOARD, GKeyboard, HInstance, GetCurrentThreadId); // ставим ловушку</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.FormDestroy(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;UnHook(Hook); // снимаем ловушку</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.GKeyboard(var Msg: TMessage);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;with Msg do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := CallNextHookEx(GetHook(Hook), Msg, WParam, LParam); // даем поработать и другим </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; //функция GetHook возвращает хендл ловушки из структуры PHookMetod</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; //если ловушка была создана не SetHook то он будет нулевым или заполнен левыми данными.</div><div class="code_line">&nbsp;&nbsp; &nbsp;if Msg = HC_ACTION then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if Byte(LParam shr 24) &#60;&#62; $C0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Label1.Caption := Chr(WParam shr 32);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
в прикремленном архиве модуль UHook и пример<br>
<br>
пс. не пытайтесь это всунуть в глобальную ловушку :D]]></description>
        <author>ViktorXP</author>
        <category>Системные функции, WinAPI, работа с железом</category>
      </item>
	
      </channel>
      </rss>
	