<?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=414321&amp;view=findpost&amp;p=3791181</guid>
        <pubDate>Thu, 28 Feb 2019 05:35:59 +0000</pubDate>
        <title>Поток и хук на клавиатуру. Как соединить их вместе?</title>
        <link>https://forum.sources.ru/index.php?showtopic=414321&amp;view=findpost&amp;p=3791181</link>
        <description><![CDATA[ugorek: Чта? Какое вычисление? Ты о чём?]]></description>
        <author>ugorek</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414321&amp;view=findpost&amp;p=3791156</guid>
        <pubDate>Wed, 27 Feb 2019 15:57:58 +0000</pubDate>
        <title>Поток и хук на клавиатуру. Как соединить их вместе?</title>
        <link>https://forum.sources.ru/index.php?showtopic=414321&amp;view=findpost&amp;p=3791156</link>
        <description><![CDATA[vasya2019: вынесите вычисление в поток и будет вам щастие]]></description>
        <author>vasya2019</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414321&amp;view=findpost&amp;p=3791062</guid>
        <pubDate>Wed, 27 Feb 2019 01:25:36 +0000</pubDate>
        <title>Поток и хук на клавиатуру. Как соединить их вместе?</title>
        <link>https://forum.sources.ru/index.php?showtopic=414321&amp;view=findpost&amp;p=3791062</link>
        <description><![CDATA[ugorek: Здравствуйте. У меня была задача получать данные о нажатой клавиши в любой момент, и изначально я использовал GetKeyState() и было нормально. Но потом оказалось, что когда программа занималась чем-то другим, то было проблематично получить данные о нажатой клавише в этот момент. Поэтому перенёс код в поток, и это помогло.<br>
Но потом появилась ещё одна проблема - если нажимать клавиши очень быстро, то некоторые из них не улавливались моим кодом. Мне нужно было не упустить ни одного нажатия, и поэтому заменил GetKeyState на хук, и это решило проблему с пропуском нажатий, но вернуло предыдущую проблему - если программа занята чем-то другим, хук не срабатывает.<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">type</div><div class="code_line">&nbsp;&nbsp;TMyThread = class(TThread)</div><div class="code_line">&nbsp;&nbsp; protected</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure Execute; override;</div><div class="code_line">&nbsp;&nbsp; end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TMyThread.Execute;</div><div class="code_line">&nbsp;begin</div><div class="code_line">&nbsp;&nbsp;inherited;</div><div class="code_line">&nbsp;&nbsp;while True do</div><div class="code_line">&nbsp;&nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;//Код в потоке, как в нём использовать хук?</div><div class="code_line">&nbsp;&nbsp; end;</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;Thread1:TMyThread;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;PKBDLLHookStruct=^TKBDLLHookStruct;</div><div class="code_line">&nbsp;&nbsp;TKBDLLHookStruct = packed record</div><div class="code_line">&nbsp;&nbsp; vkCode,scanCode,flags,time:Cardinal;</div><div class="code_line">&nbsp;&nbsp; dwExtraInfo:PCardinal;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">function HookProc(nCode,wParam,lParam:Integer):LRESULT; stdcall;</div><div class="code_line">&nbsp;begin</div><div class="code_line">&nbsp;&nbsp;if nCode=HC_ACTION then</div><div class="code_line">&nbsp;&nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;with PKBDLLHookStruct(lParam)^ do</div><div class="code_line">&nbsp;&nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;//Делаю что-то, когда нажалась клавиша vkCode</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;Result:=CallNextHookEx(0,nCode,wParam,lParam);</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;Hook:HHOOK;</div><div class="code_line">&nbsp;</div><div class="code_line">//Где-то в самом начале программы:</div><div class="code_line">&nbsp;Thread1:=TMyThread.Create(True);</div><div class="code_line">&nbsp;Thread1.FreeOnTerminate:=False;</div><div class="code_line">&nbsp;Thread1.Priority:=tpHighest;</div><div class="code_line">&nbsp;Thread1.Resume;</div><div class="code_line">&nbsp;Hook:=SetWindowsHookEx(WH_KEYBOARD_LL,@HookProc,HInstance,0);</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>ugorek</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	