<?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=88937&amp;view=findpost&amp;p=666988</guid>
        <pubDate>Fri, 01 Apr 2005 13:04:17 +0000</pubDate>
        <title>Keyboard hook - ошибка с памятью</title>
        <link>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=666988</link>
        <description><![CDATA[Rouse_: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=88937&view=findpost&p=666699'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>мыш &#064; <time class="tag-quote__quoted-time" datetime="2005-04-01T13:10:58+04:00">01.04.05, 09:10</time></span><div class='quote '>Rouse_, твой пример почему то у меня ловит только нажатия клавиш в моем приложении, из других сообщения не приходят. Почему так может быть? </div></div><br>
Не знаю, у меня все нормально, вот еще раз собрал демку - держи в архиве...]]></description>
        <author>Rouse_</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=666699</guid>
        <pubDate>Fri, 01 Apr 2005 09:10:58 +0000</pubDate>
        <title>Keyboard hook - ошибка с памятью</title>
        <link>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=666699</link>
        <description><![CDATA[мыш: <strong class='tag-b'>Rouse_</strong>, твой пример почему то у меня ловит только нажатия клавиш в моем приложении, из других сообщения не приходят. Почему так может быть?]]></description>
        <author>мыш</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=664906</guid>
        <pubDate>Wed, 30 Mar 2005 19:25:01 +0000</pubDate>
        <title>Keyboard hook - ошибка с памятью</title>
        <link>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=664906</link>
        <description><![CDATA[Rouse_: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=88937&view=findpost&p=664885'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>мыш &#064; <time class="tag-quote__quoted-time" datetime="2005-03-30T19:12:08+00:00">30.03.05, 19:12</time></span><div class='quote '>передрать внаглую все у _Rouse и не думать из расчета что много будешь знать скоро состаришься</div></div><br>
Спасибо, конечно, за характеристику, но советую всежтаки прочесть Рихтера хотя бы в качестве теории... Если и дальше будешь заниматься системой, то можешь много шишек набить при отладке хуков, а это потраченое впустую время... :)]]></description>
        <author>Rouse_</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=664885</guid>
        <pubDate>Wed, 30 Mar 2005 19:12:08 +0000</pubDate>
        <title>Keyboard hook - ошибка с памятью</title>
        <link>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=664885</link>
        <description><![CDATA[мыш: Да, автор не забыл, там это и было - ведь шпион должен не только логить клавиши, но и записывать в каком приложении они были нажаты. Я это убрал, потому что не шпиона делал, а от переменной забыл избавится.[b] <br>
<br>
В общем я принял непростое, но единственно верное  решение - передрать внаглую все у _Rouse и не думать из расчета что много будешь знать скоро состаришься :) Копирайты ессно оставил :) Все завелось с полоборота :) За сим всех благодарю и желаю долгих лет жизни, здоровья, счастья и всего самого наилучшего&#33;  :)]]></description>
        <author>мыш</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=664862</guid>
        <pubDate>Wed, 30 Mar 2005 18:53:17 +0000</pubDate>
        <title>Keyboard hook - ошибка с памятью</title>
        <link>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=664862</link>
        <description><![CDATA[alex31: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=88937&view=findpost&p=664856'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Rouse_ &#064; <time class="tag-quote__quoted-time" datetime="2005-03-30T18:47:59+00:00">30.03.05, 18:47</time></span><div class='quote '><strong class='tag-b'>alex31</strong>, точно, пропустил я это дело с AppWnd... <br>
Да вот только тут мало того что она не определена, а вообще непонятно какое значение будет иметь ибо пустая переменная, поэтому ее можно откидывать, роли она никакой не сыграет...</div></div><br>
Всего скорее,судя по комментарию, автор забыл поставить<br>
AppWnd:=GetForegroundWindow;]]></description>
        <author>alex31</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=664856</guid>
        <pubDate>Wed, 30 Mar 2005 18:47:59 +0000</pubDate>
        <title>Keyboard hook - ошибка с памятью</title>
        <link>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=664856</link>
        <description><![CDATA[Rouse_: <strong class='tag-b'>alex31</strong>, точно, пропустил я это дело с AppWnd... <br>
Да вот только тут мало того что она не определена, а вообще непонятно какое значение будет иметь ибо пустая переменная, поэтому ее можно откидывать, роли она никакой не сыграет...]]></description>
        <author>Rouse_</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=664847</guid>
        <pubDate>Wed, 30 Mar 2005 18:42:57 +0000</pubDate>
        <title>Keyboard hook - ошибка с памятью</title>
        <link>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=664847</link>
        <description><![CDATA[alex31: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=88937&view=findpost&p=664677'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Rouse_ &#064; <time class="tag-quote__quoted-time" datetime="2005-03-30T16:36:50+00:00">30.03.05, 16:36</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=88937&view=findpost&p=664508'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Serge &#064; <time class="tag-quote__quoted-time" datetime="2005-03-30T14:36:40+00:00">30.03.05, 14:36</time></span><div class='quote '>GlobalData и AppWnd здесь могут быть неопределены</div></div><br>
Чушь...<br>
И каким образом они могут быть не определены?</div></div><br>
AppWnd будет не определена...<br>
это локальная переменная функции KeyboardProc<br>
я не вижу где эта переменная там устанавливается]]></description>
        <author>alex31</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=664677</guid>
        <pubDate>Wed, 30 Mar 2005 16:36:50 +0000</pubDate>
        <title>Keyboard hook - ошибка с памятью</title>
        <link>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=664677</link>
        <description><![CDATA[Rouse_: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=88937&view=findpost&p=664508'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Serge &#064; <time class="tag-quote__quoted-time" datetime="2005-03-30T14:36:40+00:00">30.03.05, 14:36</time></span><div class='quote '>GlobalData и AppWnd здесь могут быть неопределены</div></div><br>
Чушь...<br>
И каким образом они могут быть не определены? <br>
по  DLL_PROCESS_ATTACH отрабатывает OpenGlobalData, где и происходит MapViewOfFile, а SetWindowsHookEx происходит в procedure hook, без которой <strong class='tag-b'>невозможен </strong>вызов KeyboardProc<br>
<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">procedure DLLEntryPoint(dwReason: DWord); stdcall;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
явный перебор с <strong class='tag-b'>stdcall</strong>...<br>
Собственно здесь у тебя и происходит вылет №1 при попытке выгрузки хука...<br>
Смотри реализацию здесь: <a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=43286' target='_blank'>Перехват API функций</a><br>
и вот здесь: <a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=86903' target='_blank'>Перехват recv</a><br>
Ну и естественно классический CALLBACK KeyboardProc выглядит вот так:<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">function KeyboardProc(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;</div></ol></div></div></div></div><br>
Где ты спокойно ловишь вылет №2...<br>
<br>
Ну и в заключение, а нафига спрашивается козе баян в виде неотлаженных библиотек, когда можно спокойно поставить LowLevelHook при помощи константы WH_KEYBOARD_LL = 13 и ловить все сообщения через application-defined callback function, которая аналогичны вышеописаной?]]></description>
        <author>Rouse_</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=664659</guid>
        <pubDate>Wed, 30 Mar 2005 16:18:13 +0000</pubDate>
        <title>Keyboard hook - ошибка с памятью</title>
        <link>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=664659</link>
        <description><![CDATA[Krid: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=88937&view=findpost&p=664423'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>alex31 &#064; <time class="tag-quote__quoted-time" datetime="2005-03-30T13:40:56+00:00">30.03.05, 13:40</time></span><div class='quote '>в KeyboardProc аргумент wParam должен иметь тип Longint</div></div><br>
 :yes:]]></description>
        <author>Krid</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=664508</guid>
        <pubDate>Wed, 30 Mar 2005 14:36:40 +0000</pubDate>
        <title>Keyboard hook - ошибка с памятью</title>
        <link>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=664508</link>
        <description><![CDATA[Serge: <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 KeyboardProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; &nbsp;AppWnd: HWND; &nbsp;// дескриптор приложения, в котором произошло нажатие клавишы</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if code &#60; 0 then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);</div><div class="code_line">&nbsp;&nbsp; &nbsp;Exit;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if (Code = HC_ACTION) and (((lParam shr 16) and KF_UP) = 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;then SendMessage(GlobalData^.MyAppWnd, WM_MYKEYHOOK, wParam, AppWnd);</div><div class="code_line">&nbsp;&nbsp;CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);</div><div class="code_line">&nbsp;&nbsp;Result:= 0;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
GlobalData и AppWnd здесь могут быть неопределены<br>
Поставьте проверку<br>
if GlobalData = nil then error<br>
if NOT IsWindow(AppWnd) then error]]></description>
        <author>Serge</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=664423</guid>
        <pubDate>Wed, 30 Mar 2005 13:40:56 +0000</pubDate>
        <title>Keyboard hook - ошибка с памятью</title>
        <link>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=664423</link>
        <description><![CDATA[alex31: в KeyboardProc аргумент wParam должен иметь тип Longint]]></description>
        <author>alex31</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=663160</guid>
        <pubDate>Tue, 29 Mar 2005 15:54:17 +0000</pubDate>
        <title>Keyboard hook - ошибка с памятью</title>
        <link>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=663160</link>
        <description><![CDATA[s-mike: <div class="tag-mod"><div class="tag-mod__prefix">M</div><div class="tag-mod__body">Тема перенесена из Delphi -> <a class='tag-url' href='http&#58;//forum.sources.ru/index.php?showforum=11' target='_blank'>Delphi&#58; Общие вопросы.</a></div></div>]]></description>
        <author>s-mike</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=662589</guid>
        <pubDate>Tue, 29 Mar 2005 08:58:23 +0000</pubDate>
        <title>Keyboard hook - ошибка с памятью</title>
        <link>https://forum.sources.ru/index.php?showtopic=88937&amp;view=findpost&amp;p=662589</link>
        <description><![CDATA[мыш: Для определения времени печатания пришлось ставить хук на клавиатуру. Взял готовую библиотеку из примера клавиатурного шпиона, немного подправил. Все вроде заработало: клавиши ловятся, передаются в приложение, время считается. Однако после запуска программы и установки хука почти все приложения в системе от фотошопа до блокнота стали периодически (раз в несколько минут или чаще) выдавать ошибки нарушения доступа к памяти с сообщением &quot;Ошибка по адресу траляля. Память не может быть READ&quot; При отключении ловушки (просто снес dll-ку из папки) ошибки прекратились. Проверено на двух компах. Я сделал вывод, что библиотека где-то делает грубую ошибку при работе с памятью, но сам не докумекал.<br>
Плиз, собственно, хелп.<br>
<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">procedure TForm1.WndProc(var Msg: TMessage);</div><div class="code_line">var</div><div class="code_line">CharCode:char;</div><div class="code_line">begin</div><div class="code_line">inherited ;</div><div class="code_line">if Msg.Msg = WM_MYKEYHOOK then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if Msg.wParam&#60;&#62;0 then LastKeyPressedTime:=GetTickCount;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.StartLogKey();</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Hook: procedure (switch : Boolean; hMainProg: HWND) stdcall;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;@hook:= nil;</div><div class="code_line">&nbsp;&nbsp;HookDLLHandle:= LoadLibrary(PChar(installpath+&#39;keyproc.dll&#39;));</div><div class="code_line">&nbsp;&nbsp;if HookDLLHandle &#62; HINSTANCE_ERROR then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;@hook:=GetProcAddress(HookDLLHandle, &#39;hook&#39;); </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;hook(true, form1.Handle);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.StopLogKey();</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Hook: procedure (switch : Boolean; hMainProg: HWND) stdcall;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;@hook:= nil;</div><div class="code_line">&nbsp;&nbsp;if HookDLLHandle &#62; HINSTANCE_ERROR then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;@hook:=GetProcAddress(HookDLLHandle, &#39;hook&#39;); &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;hook(false, Form1.Handle);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if FreeLibrary(HookDLLHandle) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;log(0,&#39;Keyproc close ok&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;log(0,&#39;Error close keyproc&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">initialization</div><div class="code_line">WM_MYKEYHOOK:= RegisterWindowMessage(&#39;WM_MYKEYHOOK&#39;);</div></ol></div></div></div></div><br>
<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">library keyproc;</div><div class="code_line">&nbsp;</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;SysUtils,</div><div class="code_line">&nbsp;&nbsp;Windows,</div><div class="code_line">&nbsp;&nbsp;Messages;</div><div class="code_line">&nbsp;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;MMFName: PChar = &#39;KeyMMF&#39;;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;PGlobalDLLData = ^TGlobalDLLData;</div><div class="code_line">&nbsp;&nbsp;TGlobalDLLData = packed record</div><div class="code_line">&nbsp;&nbsp; &nbsp;SysHook: HWND;</div><div class="code_line">&nbsp;&nbsp; &nbsp;MyAppWnd: HWND;</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;GlobalData: PGlobalDLLData;</div><div class="code_line">&nbsp;&nbsp;MMFHandle: THandle;</div><div class="code_line">&nbsp;&nbsp;WM_MYKEYHOOK: Cardinal;</div><div class="code_line">&nbsp;&nbsp;a:integer;</div><div class="code_line">&nbsp;</div><div class="code_line">function KeyboardProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; &nbsp;AppWnd: HWND; &nbsp;// дескриптор приложения, в котором произошло нажатие клавишы</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if code &#60; 0 then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);</div><div class="code_line">&nbsp;&nbsp; &nbsp;Exit;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if (Code = HC_ACTION) and (((lParam shr 16) and KF_UP) = 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;then SendMessage(GlobalData^.MyAppWnd, WM_MYKEYHOOK, wParam, AppWnd);</div><div class="code_line">&nbsp;&nbsp;CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);</div><div class="code_line">&nbsp;&nbsp;Result:= 0;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">{Процедура установки HOOK-а}</div><div class="code_line">procedure hook(switch : Boolean; hMainProg: HWND) export; stdcall;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if switch=true then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;{Устанавливаю HOOK, если он не установлен (switch=true). }</div><div class="code_line">&nbsp;&nbsp; &nbsp;GlobalData^.SysHook := SetWindowsHookEx(WH_keyboard, @KeyboardProc, HInstance, 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp;GlobalData^.MyAppWnd:= hMainProg;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if GlobalData^.SysHook &#60;&#62; 0 then a:=1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//MessageBox(0, &#39;KEYBOARD HOOK установлен !&#39;, &#39;Message from keyhook.dll&#39;, 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a:=0;</div><div class="code_line">// &nbsp; &nbsp; &nbsp; &nbsp;MessageBox(0, &#39;HOOK установить не удалось !&#39;, &#39;Message from keyhook.dll&#39;, 0);</div><div class="code_line">&nbsp;&nbsp;end</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;{Удаляю функцию-фильтр, если она установлена (т.е. switch=false). }</div><div class="code_line">&nbsp;&nbsp; &nbsp;if UnhookWindowsHookEx(GlobalData^.SysHook) then a:=1</div><div class="code_line">// &nbsp; &nbsp; &nbsp;MessageBox(0, &#39;HOOK снят !&#39;, &#39;Message from keyhook.dll&#39;, 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp;else a:=1;</div><div class="code_line">// &nbsp; &nbsp; &nbsp;MessageBox(0, &#39;HOOK снять не удалось !&#39;, &#39;Message from keyhook.dll&#39;, 0);</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">procedure OpenGlobalData();</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;{регестрируем свой тип сообщения в системе}</div><div class="code_line">&nbsp;&nbsp;WM_MYKEYHOOK:= RegisterWindowMessage(&#39;WM_MYKEYHOOK&#39;);</div><div class="code_line">&nbsp;&nbsp;{получаем объект файлового отображения}</div><div class="code_line">&nbsp;&nbsp;MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);</div><div class="code_line">&nbsp;&nbsp;if MMFHandle = 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;//MessageBox(0, &#39;Can&#39;&#39;t create FileMapping&#39;, &#39;Message from keyhook.dll&#39;, 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;{отображаем глобальные данные на АП вызывающего процесса и получаем указатель</div><div class="code_line">&nbsp;&nbsp; на начало выделенного пространства}</div><div class="code_line">&nbsp;&nbsp;GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));</div><div class="code_line">&nbsp;&nbsp;if GlobalData = nil then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;CloseHandle(MMFHandle);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;MessageBox(0, &#39;Can&#39;&#39;t make MapViewOfFile&#39;, &#39;Message from keyhook.dll&#39;, 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure CloseGlobalData();</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;UnmapViewOfFile(GlobalData);</div><div class="code_line">&nbsp;&nbsp;CloseHandle(MMFHandle);</div><div class="code_line">end;</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: OpenGlobalData;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DLL_PROCESS_DETACH: CloseGlobalData;</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 hook;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">//MessageBox(0, PChar(Application.ExeName), &#39;Message from keyhook.dll&#39;, 0);</div><div class="code_line">&nbsp;&nbsp;{назначим поцедуру переменной DLLProc}</div><div class="code_line">&nbsp;&nbsp;DLLProc:= @DLLEntryPoint;</div><div class="code_line">&nbsp;&nbsp;{вызываем назначенную процедуру для отражения факта присоединения данной</div><div class="code_line">&nbsp;&nbsp; библиотеки к процессу}</div><div class="code_line">&nbsp;&nbsp;DLLEntryPoint(DLL_PROCESS_ATTACH);</div><div class="code_line">end.</div></ol></div></div></div></div>]]></description>
        <author>мыш</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      </channel>
      </rss>
	