<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" >
  <channel>
  <title>BCB - Freedom tactics</title>
  <link>https://lresult.blog.shinobi.jp/</link>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="https://lresult.blog.shinobi.jp/RSS/" />
  <description>Borland C++ Builderを用いたWindowsプログラミングメモブログ</description>
  <lastBuildDate>Tue, 22 Jan 2008 11:38:48 GMT</lastBuildDate>
  <language>ja</language>
  <copyright>© Ninja Tools Inc.</copyright>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />

    <item>
    <title>移転しました。</title>
    <description>
    <![CDATA[<p>移転してみました。<br />
スレッドやコンポーネントなどを追加してってます。<br />
<a href="http://bcb.client.jp/">http://bcb.client.jp/</a></p>]]>
    </description>
    <category>Programing</category>
    <link>https://lresult.blog.shinobi.jp/programing/%E7%A7%BB%E8%BB%A2%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82</link>
    <pubDate>Tue, 22 Jan 2008 11:38:48 GMT</pubDate>
    <guid isPermaLink="false">lresult.blog.shinobi.jp://entry/14</guid>
  </item>
    <item>
    <title>WindowFromPoint : マウス位置からウィンドウハンドルを取得する</title>
    <description>
    <![CDATA[<p><font face="Courier New" size="2">マウスカーソルの位置を利用してウィンドウハンドルを取得してみる</font></p>
<p><font face="Courier New" size="2">GetCursorPos&nbsp;&nbsp;&nbsp; マウスカーソルの位置を取得<br />
WindowFromPoint 指定座標にあるウィンドウハンドルを取得<br />
<br />
<a target="_blank" href="//lresult.blog.shinobi.jp/File/windowfrompoint.png"><img alt="windowfrompoint.png" align="left" border="0" src="/Img/1163929734/" /></a></font></p>
<p><font face="Courier New" size="2"></font></p>
<p><font face="Courier New" size="2"><br />
&larr;こんな感じでフォームを作ってみた</font></p>
<font face="Courier New" size="2">
<p><br />
<br />
<br />
<br />
<br />
<br />
TEdit名&nbsp;&nbsp; HandleEdit, TitleEdit<br />
TButton名 WindowFromPointBtnとしました。</p>
<p>WindowFromPointBtnを押すとマウスカーソル位置の<br />
ウィンドウハンドルとタイトルが表示されます。</p>
<p>試しにメモ帳を起動して、マウスカーソルをメモ帳の<br />
タイトルバー上に持って行き、<br />
EnterキーでWindowFromPointBtnを押してやります。<br />
すると、メモ帳のハンドルとタイトルが表示されるのです。<br />
<br />
<br />
<br />
<br />
<font style="BACKGROUND-COLOR: #ffff99">&lt;Unit1.cpp&gt;<br />
</font><font color="#006600">//---------------------------------------------------------------------------</font></p>
<p><font face="Courier New" size="2">#include &lt;vcl.h&gt;<br />
#pragma hdrstop</font></p>
<p><font face="Courier New" size="2">#include &quot;Unit1.h&quot;<br />
<font color="#006600">//---------------------------------------------------------------------------</font><br />
#pragma package(smart_init)<br />
#pragma resource &quot;*.dfm&quot;<br />
TForm1 *Form1;<br />
<font color="#006600">//---------------------------------------------------------------------------</font><br />
__fastcall TForm1::TForm1(TComponent* Owner)<br />
&nbsp;&nbsp;&nbsp; : TForm(Owner)<br />
{<br />
}<br />
<font color="#006600">//---------------------------------------------------------------------------</font><br />
void __fastcall TForm1::WindowFromPointBtnClick(TObject *Sender)<br />
{<br />
&nbsp;&nbsp;&nbsp; POINT pt;</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// マウスカーソルの位置をスクリーン座標で取得</font><br />
&nbsp;&nbsp;&nbsp; GetCursorPos(&amp;pt);</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// カーソル位置からウィンドウハンドル取得</font><br />
&nbsp;&nbsp;&nbsp; HWND hWnd = WindowFromPoint(pt);</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// 後はいつも通りの表示処理を行う</font><br />
&nbsp;&nbsp;&nbsp; int&nbsp; tLen&nbsp;&nbsp;&nbsp; = GetWindowTextLength(hWnd) + 2;&nbsp;&nbsp; <font color="#006600">// タイトル文字長取得</font><br />
&nbsp;&nbsp;&nbsp; char *sTitle = (char *)malloc(tLen);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#006600">// タイトル格納用領域確保</font><br />
&nbsp;&nbsp;&nbsp; GetWindowText(hWnd, sTitle, tLen);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#006600">// タイトル取得</font></font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// Editに表示</font><br />
&nbsp;&nbsp;&nbsp; HandleEdit-&gt;Text = IntToHex((int)hWnd, 8);<br />
&nbsp;&nbsp;&nbsp; TitleEdit-&gt;Text&nbsp; = sTitle;</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// 解放<br />
</font>&nbsp;&nbsp;&nbsp; free(sTitle);<br />
}<br />
<font color="#006600">//---------------------------------------------------------------------------</font><br />
</font></p>
<p><font face="Courier New" size="2"></font></p>
</font>]]>
    </description>
    <category>Programing</category>
    <link>https://lresult.blog.shinobi.jp/programing/windowfrompoint%20-%20%E3%83%9E%E3%82%A6%E3%82%B9%E4%BD%8D%E7%BD%AE%E3%81%8B%E3%82%89%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AB%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B</link>
    <pubDate>Sun, 19 Nov 2006 09:55:01 GMT</pubDate>
    <guid isPermaLink="false">lresult.blog.shinobi.jp://entry/13</guid>
  </item>
    <item>
    <title>GetActiveWindow : アクティブウィンドウのハンドルを取得する</title>
    <description>
    <![CDATA[<p><font face="Courier New" size="2">アクティブウィンドウハンドルの取得と<br />
次のZ順位のウィンドウハンドルを取得を試してみる<br />
<br />
GetActiveWindow アクティブウィンドウのハンドルを取得<br />
GetNextWindow　　指定されたハンドルの次の順位のウィンドウハンドルを取得</font></p>
<p><a target="_blank" href="//lresult.blog.shinobi.jp/File/getactivewindow.png"><font face="Courier New" size="2"><img alt="getactivewindow.png" align="left" border="0" src="/Img/1163911661/" /></font></a></p>
<p><font face="Courier New" size="2"></font></p>
<p><br />
<font face="Courier New" size="2">&larr;こんな感じでフォームを作ってみた<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
TEdit名&nbsp;&nbsp; ActiveHandleEdit, NextHandleEdit, ActiveTitleEdit, NextTitleEdit<br />
TButton名 GetHandleBtnとしました。</font></p>
<p><font face="Courier New" size="2">GetHandleBtnを押すと、アクティブウィンドウのハンドルとタイトル、<br />
及び次の順位となるハンドルとタイトルを表示してくれます。</font></p>
<p><font face="Courier New" size="2">ボタンを押すときは常に自アプリがアクティブウィンドウとなる為<br />
表示されるハンドルとタイトルは自アプリのものです。<br />
また、次のハンドルはspy++などで見ると、確かに次のハンドルが表示されています。</font></p>
<p><br />
<font face="Courier New" size="2">作ってはみたものの、、これはあんまし使えないですな。。<br />
もうちょっと別の使い方を考えねば。<br />
</font></p>
<p><font color="#006600"><font style="BACKGROUND-COLOR: #ffff99" color="#000000"><br />
<br />
<br />
<br />
<font face="Courier New" size="2">&lt;Unit1.cpp&gt;</font></font><br />
<font face="Courier New" size="2">//---------------------------------------------------------------------------</font></font></p>
<p><font face="Courier New" size="2">#include &lt;vcl.h&gt;<br />
#pragma hdrstop</font></p>
<p><font face="Courier New"><font size="2">#include &quot;Unit1.h&quot;<br />
<font color="#006600">//---------------------------------------------------------------------------</font><br />
#pragma package(smart_init)<br />
#pragma resource &quot;*.dfm&quot;<br />
TForm1 *Form1;<br />
<font color="#006600">//---------------------------------------------------------------------------</font><br />
__fastcall TForm1::TForm1(TComponent* Owner)<br />
&nbsp;&nbsp;&nbsp; : TForm(Owner)<br />
{<br />
}<br />
<font color="#006600">//---------------------------------------------------------------------------</font></font></font></p>
<p><font face="Courier New" size="2">void __fastcall TForm1::GetHandleBtnClick(TObject *Sender)<br />
{</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// アクティブウィンドウのハンドルを取得</font><br />
&nbsp;&nbsp;&nbsp; HWND acthWnd&nbsp; = GetActiveWindow();</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// アクティブウィンドウの次の順位のウィンドウハンドルを取得</font><br />
&nbsp;&nbsp;&nbsp; HWND nexthWnd = GetNextWindow(acthWnd, GW_HWNDNEXT);</font></p>
<p><br />
<font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; </font><font face="Courier New"><font size="2"><font color="#006600">// 確認の為、ハンドルからタイトルを取得します<br />
&nbsp;&nbsp;&nbsp; // 前回と同様にタイトル長を取得<br />
</font>&nbsp;&nbsp;&nbsp; int actLen&nbsp; = GetWindowTextLength(acthWnd)&nbsp; + 2;<br />
&nbsp;&nbsp;&nbsp; int nextLen = GetWindowTextLength(nexthWnd) + 2;</font></font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; </font><font face="Courier New"><font size="2"><font color="#006600">// タイトル格納用に確保<br />
</font>&nbsp;&nbsp;&nbsp; char *actTitle&nbsp; = (char *)malloc(actLen);<br />
&nbsp;&nbsp;&nbsp; char *nextTitle = (char *)malloc(nextLen);</font></font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; </font><font face="Courier New"><font size="2"><font color="#006600">// それぞれのタイトル取得<br />
</font>&nbsp;&nbsp;&nbsp; GetWindowText(acthWnd,&nbsp; actTitle,&nbsp; actLen);<br />
&nbsp;&nbsp;&nbsp; GetWindowText(nexthWnd, nextTitle, nextLen);</font></font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// Editコンポーネントへ表示</font><br />
&nbsp;&nbsp;&nbsp; ActiveHandleEdit-&gt;Text = IntToHex((int)acthWnd, 8);<br />
&nbsp;&nbsp;&nbsp; NextHandleEdit-&gt;Text&nbsp;&nbsp; = IntToHex((int)nexthWnd,8);</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; ActiveTitleEdit-&gt;Text = actTitle;<br />
&nbsp;&nbsp;&nbsp; NextTitleEdit-&gt;Text&nbsp;&nbsp; = nextTitle;</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; </font><font face="Courier New"><font size="2"><font color="#006600">// 領域解放<br />
</font>&nbsp;&nbsp;&nbsp; free(actTitle);<br />
&nbsp;&nbsp;&nbsp; free(nextTitle);<br />
}<br />
<font color="#006600">//---------------------------------------------------------------------------</font><br />
</font></font></p>
<p><font face="Courier New" size="2"></font></p>]]>
    </description>
    <category>Programing</category>
    <link>https://lresult.blog.shinobi.jp/programing/getactivewindow%20-%20%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%81%AE%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AB%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B</link>
    <pubDate>Sun, 19 Nov 2006 04:54:49 GMT</pubDate>
    <guid isPermaLink="false">lresult.blog.shinobi.jp://entry/12</guid>
  </item>
    <item>
    <title>EnumWindows : ウィンドウハンドルを列挙し、タイトルを取得する</title>
    <description>
    <![CDATA[<p><font face="Courier New" size="2">今度は全ての親ウィンドウハンドルを列挙しつつタイトルも取得してみる<br />
EnumWindowsでハンドル列挙<br />
GetWindowTextでハンドルからタイトルの取得</font></p>
<p><font face="Courier New" size="2"><a target="_blank" href="//lresult.blog.shinobi.jp/File/enumwindows.png"><img alt="enumwindows.png" align="left" border="0" src="/Img/1163904904/" /></a><br />
<br />
&larr;こんな感じでフォームを作ってみた<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
TMemo名&nbsp;&nbsp; Memo1<br />
TButton名 DispHandleBtnとしました。<br />
<br />
Memo1のプロパティ<br />
ScrollBarsをssBothにして縦横スクロールバー表示。<br />
Anchorsを全てtrueにしてフォームサイズ変更に対応。</font></p>
<p><font face="Courier New" size="2">DispHandleBtnを押すと、ズィっと取得してくれます。<br />
<br />
前回のFindWindowでは、完全なタイトルを入力しないと<br />
ハンドルを返してくれなかったのですが、<br />
今回はハンドルを列挙する為、列挙されたハンドルから<br />
指定の文字列とタイトルを比較すれば、<br />
欲しいウィンドウハンドルを取得できたりと、応用できます。</font></p>
<p><font face="Courier New" color="#006600" size="2"><font style="BACKGROUND-COLOR: #ffff99"><font color="#000000">&lt;Unit1.cpp&gt;</font><br />
</font>//---------------------------------------------------------------------------</font></p>
<p><font face="Courier New" size="2">#include &lt;vcl.h&gt;<br />
#pragma hdrstop</font></p>
<p><font face="Courier New" size="2">#include &quot;Unit1.h&quot;<br />
<font color="#006600">//---------------------------------------------------------------------------</font><br />
#pragma package(smart_init)<br />
#pragma resource &quot;*.dfm&quot;<br />
TForm1 *Form1;</font></p>
<p><font face="Courier New" size="2"><font color="#006600">// コールバック関数宣言</font><br />
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam);</font></p>
<p><font face="Courier New" size="2"><font color="#006600">//---------------------------------------------------------------------------</font><br />
__fastcall TForm1::TForm1(TComponent* Owner)<br />
&nbsp;&nbsp;&nbsp; : TForm(Owner)<br />
{<br />
}<br />
<font color="#006600">//---------------------------------------------------------------------------</font></font></p>
<p><font face="Courier New" size="2">void __fastcall TForm1::DispHandleBtnClick(TObject *Sender)<br />
{<br />
&nbsp;&nbsp;&nbsp; <font color="#006600">// 画面上のウィンドウハンドルを全て列挙します</font><br />
&nbsp;&nbsp;&nbsp; EnumWindows((WNDENUMPROC)EnumWindowsProc, 0);<br />
}<br />
<font color="#006600">//---------------------------------------------------------------------------</font><br />
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)<br />
{<br />
&nbsp;&nbsp;&nbsp; char *sTitle;<br />
&nbsp;&nbsp;&nbsp; int TitleLength;</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// タイトルの文字数を取得します</font><br />
&nbsp;&nbsp;&nbsp; TitleLength = GetWindowTextLength(hWnd) + 2;</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// タイトル格納用の領域確保</font><br />
&nbsp;&nbsp;&nbsp; sTitle = (char *)malloc(TitleLength);</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// ハンドルからタイトルを取得<br />
</font>&nbsp;&nbsp;&nbsp; GetWindowText(hWnd, sTitle, TitleLength);</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// ハンドルとタイトルをMemo1へ表示</font><br />
&nbsp;&nbsp;&nbsp; AnsiString str = IntToHex((int)hWnd, 8) + &quot; : &quot; + sTitle;<br />
&nbsp;&nbsp;&nbsp; Form1-&gt;Memo1-&gt;Lines-&gt;Add(str);</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// 領域解放<br />
</font>&nbsp;&nbsp;&nbsp; free(sTitle);</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// 列挙を続ける場合、TRUEを返します</font><br />
&nbsp;&nbsp;&nbsp; return TRUE;<br />
}<br />
<font color="#006600">//---------------------------------------------------------------------------</font><br />
</font></p>
<p><font face="Courier New" size="2"></font></p>]]>
    </description>
    <category>Programing</category>
    <link>https://lresult.blog.shinobi.jp/programing/enumwindows%20-%20%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AB%E3%82%92%E5%88%97%E6%8C%99%E3%81%97%E3%80%81%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B</link>
    <pubDate>Sun, 19 Nov 2006 03:07:31 GMT</pubDate>
    <guid isPermaLink="false">lresult.blog.shinobi.jp://entry/11</guid>
  </item>
    <item>
    <title>FindWindow : ウィンドウのタイトルからハンドルを取得する</title>
    <description>
    <![CDATA[<p><font face="Courier New" size="2">ウィンドウのタイトルからウィンドウハンドルを取得してみる</font></p>
<p><a target="_blank" href="//lresult.blog.shinobi.jp/File/findhandle.png"><font face="Courier New" size="2"><img alt="findhandle.png" align="left" border="0" src="/Img/1163862831/" /></font></a></p>
<p><br />
<font face="Courier New" size="2">&larr;こんな感じでフォームを作ってみた<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
</font></p>
<p><font face="Courier New" size="2"></font></p>
<p><font face="Courier New" size="2"></font></p>
<p><font face="Courier New" size="2"></font></p>
<p><font face="Courier New" size="2">TEdit名&nbsp;&nbsp; TitleEdit, HandleEdit<br />
TButton名 FindhandleBtnとしました。</font></p>
<p><font face="Courier New" size="2">前回のようにSpy++や、Winspector Spyというツールを使用すれば<br />
楽にハンドルが分かりますが、やはり自前で取得しないと、なかなか使い道が無いです。</font><font face="Courier New" size="2"><br />
</font></p>
<p><font face="Courier New" size="2"><font face="Courier New" size="2">試しに今回もメモ帳を起動します。<br />
上側のタイトルバーに表示されている文字「無題 - メモ帳」を<br />
TitleEditに入力します。<br />
で、FindHandleBtnを押せば、ウィンドウハンドルが表示されます。<br />
</font></font></p>
<p><font face="Courier New" size="2"><a target="_blank" href="//lresult.blog.shinobi.jp/File/findhandle_result.png"><img alt="findhandle_result.png" align="left" border="0" src="/Img/1163862735/" /></a></font></p>
<p><font face="Courier New" size="2"></font></p>
<p><font face="Courier New" size="2"><br />
<br />
&larr;結果はこんな感じ</font></p>
<p><font size="2"><font face="Courier New"><font face="Courier New" size="2"></font></font></font></p>
<p>&nbsp;<br />
<br />
<br />
<br />
<br />
<font face="Courier New" size="2">こいつと、前回作成したアプリを終了させるコードを組み合わせると<br />
タイトルを入力すればアプリを終了させれるツールが作れるわけです。</font></p>
<p><font size="2"><font face="Courier New">補足：IntToHex((int)hWnd, 8)について<br />
　　　第1引数は16進数にしたいint型、第2引数は何桁表示にしたいかです。<br />
　　　今回は8桁に指定している為、上位2桁は&quot;00&quot;と表示されています。</font><br />
</font></p>
<p><font face="Courier New"><font size="2"><font style="BACKGROUND-COLOR: #ffff99">&lt;Unit1.h&gt;</font><br />
<font color="#006600">//---------------------------------------------------------------------------</font></font></font></p>
<p><font face="Courier New" size="2">#ifndef Unit1H<br />
#define Unit1H<br />
<font color="#006600">//---------------------------------------------------------------------------</font><br />
#include &lt;Classes.hpp&gt;<br />
#include &lt;Controls.hpp&gt;<br />
#include &lt;StdCtrls.hpp&gt;<br />
#include &lt;Forms.hpp&gt;<br />
</font><font face="Courier New"><font size="2"><font color="#006600">//---------------------------------------------------------------------------<br />
</font>class TForm1 : public TForm<br />
{<br />
__published:&nbsp;<font color="#006600">// IDE 管理のコンポーネント</font><br />
&nbsp;&nbsp;&nbsp; TLabel *TitleLabel;<br />
&nbsp;&nbsp;&nbsp; TEdit *TitleEdit;<br />
&nbsp;&nbsp;&nbsp; TButton *FindHandleBtn;<br />
&nbsp;&nbsp;&nbsp; TEdit *HandleEdit;<br />
&nbsp;&nbsp;&nbsp; TLabel *HandleLabel;<br />
&nbsp;&nbsp;&nbsp; void __fastcall FindHandleBtnClick(TObject *Sender);<br />
private:&nbsp;<font color="#006600">// ユーザー宣言</font><br />
public:&nbsp;&nbsp;<font color="#006600">// ユーザー宣言</font><br />
&nbsp;&nbsp;&nbsp; __fastcall TForm1(TComponent* Owner);<br />
};<br />
</font></font><font face="Courier New"><font size="2"><font color="#006600">//---------------------------------------------------------------------------<br />
</font>extern PACKAGE TForm1 *Form1;<br />
</font></font><font face="Courier New"><font size="2"><font color="#006600">//---------------------------------------------------------------------------<br />
</font>#endif<br />
</font></font></p>
<p><font face="Courier New" size="2"></font></p>
<p><font face="Courier New"><font size="2"><font style="BACKGROUND-COLOR: #ffff99">&lt;Unit1.cpp&gt;</font><br />
<font color="#006600">//---------------------------------------------------------------------------</font></font></font></p>
<p><font face="Courier New" size="2">#include &lt;vcl.h&gt;<br />
#pragma hdrstop</font></p>
<p><font face="Courier New" size="2">#include &quot;Unit1.h&quot;<br />
<font color="#006600">//---------------------------------------------------------------------------</font><br />
#pragma package(smart_init)<br />
#pragma resource &quot;*.dfm&quot;<br />
TForm1 *Form1;<br />
<font color="#006600">//---------------------------------------------------------------------------</font><br />
__fastcall TForm1::TForm1(TComponent* Owner)<br />
&nbsp;&nbsp;&nbsp; : TForm(Owner)<br />
{<br />
}<br />
</font><font face="Courier New"><font size="2"><font color="#006600">//---------------------------------------------------------------------------<br />
</font>void __fastcall TForm1::FindHandleBtnClick(TObject *Sender)<br />
{<br />
&nbsp;&nbsp;&nbsp; </font></font><font face="Courier New"><font size="2"><font color="#006600">// タイトルを取得します<br />
</font>&nbsp;&nbsp;&nbsp; AnsiString sTitle = TitleEdit-&gt;Text;</font></font></p>
<p><font face="Courier New"><font size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// ウィンドウのタイトルからハンドルを取得します</font><br />
&nbsp;&nbsp;&nbsp; <font color="#800000">HWND hWnd = FindWindow(NULL, sTitle.c_str());</font></font></font></p>
<p><font face="Courier New"><font size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// ハンドルをEditBoxへ表示</font><br />
&nbsp;&nbsp;&nbsp; HandleEdit-&gt;Text = IntToHex((int)hWnd, 8);<br />
}<br />
<font color="#006600">//---------------------------------------------------------------------------</font></font></font></p>
<p><font face="Courier New" size="2"></font></p>
<p>&nbsp;</p>]]>
    </description>
    <category>Programing</category>
    <link>https://lresult.blog.shinobi.jp/programing/findwindow%20-%20%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB%E3%81%8B%E3%82%89%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AB%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B</link>
    <pubDate>Sat, 18 Nov 2006 15:33:58 GMT</pubDate>
    <guid isPermaLink="false">lresult.blog.shinobi.jp://entry/10</guid>
  </item>
    <item>
    <title>PostMessage : ポストメッセージを送信し、アプリを終了させる</title>
    <description>
    <![CDATA[<p><font face="Courier New" size="2">ポストメッセージの送信を試してみる<br />
</font><font face="Courier New" size="2"><br />
<a target="_blank" href="//lresult.blog.shinobi.jp/File/postmsgform.png"><img alt="postmsgform.png" align="left" border="0" src="/Img/1163857194/" /></a></font></p>
<p><font face="Courier New" size="2"></font></p>
<p><font face="Courier New" size="2"><font style="BACKGROUND-COLOR: #ffff99"></font></font></p>
<p><font face="Courier New" size="2"><font style="BACKGROUND-COLOR: #ffff99"></font></font></p>
<p><font face="Courier New" size="2"><font style="BACKGROUND-COLOR: #ffff99"></font></font></p>
<p><font face="Courier New" size="2">&larr;こんな感じでフォームを作ってみた。<br />
</font></p>
<p><font face="Courier New" size="2"></font></p>
<p><font face="Courier New" size="2"></font></p>
<p><font face="Courier New" size="2"></font></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br />
<br />
TEdit名&nbsp;&nbsp;&nbsp; HandleEdit, MsgEdit, wParamEdit, lParamEdit<br />
TButton名&nbsp; PostMessageBtnとしました。</p>
<p><font face="Courier New" size="2">さっそく、メッセージのWM_CLOSE(0x0010)をアプリに送信して<br />
そのメッセージが送信されたアプリを終了させてみる。<br />
<br />
試しにメモ帳を起動します。<br />
</font><font face="Courier New" size="2">今回はメモ帳のハンドルを見つける為にツールを使用します。<br />
VCに付いているツール、「spy++」や<br />
BCBに付いてくる「WinSight32」<br />
フリーだと「Winspector Spy」が有名らしいです。</font></p>
<p><font face="Courier New" size="2">あいにく、、BCBに付いている「WinSight32」は非常に使い難いやら重いやら。。</font></p>
<p><font face="Courier New" size="2">まぁなんだかんだで、メモ帳のハンドルが分かれば、その値をHandleEditにコピペします<br />
次にMsgEditにWM_CLOSE、つまり「10」を入力<br />
lParamとwParamは使わない為、「0」を入力しておきます。</font></p>
<p><font face="Courier New" size="2">PostMessageBtnを押すと、ポストメッセージが送信され<br />
メモ帳が終了します。<br />
最初に試したときは感動しましたよ、コレ。</font></p>
<p><font face="Courier New" size="2">補足：StrToInt(&quot;$&quot; + StrHex)というように<br />
　　　先頭に&quot;$&quot;を付けてStrToIntを使うと<br />
　　　16進数表記の文字列を10進数のint型にキャスト出来ます。便利便利。</font></p>
<p><font face="Courier New" size="2"><font style="BACKGROUND-COLOR: #ffff99">&lt;Unit1.h&gt;</font><br />
<font color="#006600">//---------------------------------------------------------------------------</font></font></p>
<p><font face="Courier New" size="2">#ifndef Unit1H<br />
#define Unit1H<br />
<font color="#006600">//---------------------------------------------------------------------------<br />
</font>#include &lt;Classes.hpp&gt;<br />
#include &lt;Controls.hpp&gt;<br />
#include &lt;StdCtrls.hpp&gt;<br />
#include &lt;Forms.hpp&gt;<br />
<font color="#006600">//---------------------------------------------------------------------------</font><br />
class TForm1 : public TForm<br />
{<br />
__published:&nbsp;<font color="#006600">// IDE 管理のコンポーネント</font><br />
&nbsp;&nbsp;&nbsp; TLabel *HandleLabel;<br />
&nbsp;&nbsp;&nbsp; TLabel *MsgLabel;<br />
&nbsp;&nbsp;&nbsp; TLabel *wParamLabel;<br />
&nbsp;&nbsp;&nbsp; TLabel *lParamLabel;<br />
&nbsp;&nbsp;&nbsp; TEdit *HandleEdit;<br />
&nbsp;&nbsp;&nbsp; TEdit *MsgEdit;<br />
&nbsp;&nbsp;&nbsp; TEdit *wParamEdit;<br />
&nbsp;&nbsp;&nbsp; TEdit *lParamEdit;<br />
&nbsp;&nbsp;&nbsp; TButton *PostMessageBtn;<br />
&nbsp;&nbsp;&nbsp; void __fastcall PostMessageBtnClick(TObject *Sender);<br />
private:&nbsp;// ユーザー宣言<br />
public:&nbsp;&nbsp;// ユーザー宣言<br />
&nbsp;&nbsp;&nbsp; __fastcall TForm1(TComponent* Owner);<br />
};<br />
<font color="#006600">//---------------------------------------------------------------------------<br />
</font>extern PACKAGE TForm1 *Form1;<br />
<font color="#006600">//---------------------------------------------------------------------------<br />
</font>#endif</font></p>
<p><font face="Courier New" size="2"></font></p>
<p><font face="Courier New" size="2"><font style="BACKGROUND-COLOR: #ffff99">&lt;Unit1.cpp&gt;<br />
</font><font color="#006600">//---------------------------------------------------------------------------</font></font></p>
<p><font face="Courier New" size="2">#include &lt;vcl.h&gt;<br />
#pragma hdrstop</font></p>
<p><font face="Courier New" size="2">#include &quot;Unit1.h&quot;<br />
<font color="#006600">//---------------------------------------------------------------------------<br />
</font>#pragma package(smart_init)<br />
#pragma resource &quot;*.dfm&quot;<br />
TForm1 *Form1;<br />
<font color="#006600">//---------------------------------------------------------------------------</font><br />
__fastcall TForm1::TForm1(TComponent* Owner)<br />
&nbsp;&nbsp;&nbsp; : TForm(Owner)<br />
{<br />
}<br />
<font color="#006600">//---------------------------------------------------------------------------</font><br />
void __fastcall TForm1::PostMessageBtnClick(TObject *Sender)<br />
{<br />
&nbsp;&nbsp;&nbsp; <font color="#006600">// ハンドル, メッセージ, wPram, lPramをそれぞれ宣言してやります</font><br />
&nbsp;&nbsp;&nbsp; HWND hWnd;<br />
&nbsp;&nbsp;&nbsp; UINT msg, wParam;<br />
&nbsp;&nbsp;&nbsp; LONG lParam;</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// それぞれの値を設定します<br />
</font>&nbsp;&nbsp;&nbsp; hWnd&nbsp;&nbsp; = (HWND)StrToInt(&quot;$&quot; + HandleEdit-&gt;Text);<br />
&nbsp;&nbsp;&nbsp; msg&nbsp;&nbsp;&nbsp; = (UINT)StrToInt(&quot;$&quot; + MsgEdit-&gt;Text);<br />
&nbsp;&nbsp;&nbsp; wParam = (UINT)StrToInt(&quot;$&quot; + wParamEdit-&gt;Text);<br />
&nbsp;&nbsp;&nbsp; lParam = (LONG)StrToInt(&quot;$&quot; + lParamEdit-&gt;Text);</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// ポストメッセージ送信</font><br />
&nbsp;&nbsp;&nbsp; PostMessage(hWnd, msg, wParam, lParam);<br />
}<br />
<font color="#006600">//---------------------------------------------------------------------------</font></font></p>
<p><font face="Courier New" size="2"></font></p>]]>
    </description>
    <category>Programing</category>
    <link>https://lresult.blog.shinobi.jp/programing/postmessage%20-%20%E3%83%9D%E3%82%B9%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E9%80%81%E4%BF%A1%E3%81%97%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E7%B5%82%E4%BA%86%E3%81%95%E3%81%9B%E3%82%8B</link>
    <pubDate>Sat, 18 Nov 2006 14:01:30 GMT</pubDate>
    <guid isPermaLink="false">lresult.blog.shinobi.jp://entry/9</guid>
  </item>
    <item>
    <title>マウスのグローバルフック　DLL側</title>
    <description>
    <![CDATA[<p><font face="Courier New" size="2">マウスのグローバルフックを試してみる<br />
今回もDLLは<font color="#993300">VC6.0</font>で作成<br />
呼び出し側のアプリは全く同じものなので省略で。<br />
キーボードのフックとほとんど同じですな。</font></p>
<p><font face="Courier New" size="2">・[新規作成] &rarr; [プロジェクト]タブ &rarr; Win32 Dynamic-Link Library を選んで<br />
　プロジェクト名 &quot;MouseHook&quot;で作成してから...</font></p>
<p><font face="Courier New"><font size="2"><font style="BACKGROUND-COLOR: #ffff99">&lt;DLL側　MouseHook.cpp&gt;</font><br />
</font></font><font face="Courier New" color="#006600" size="2">// MouseHook.cpp : DLL アプリケーション用のエントリ ポイントを定義します。<br />
//</font></p>
<p><font face="Courier New" size="2">#include &quot;stdafx.h&quot;</font></p>
<p><font face="Courier New" size="2">#define DLLEXPORT extern &quot;C&quot; __declspec(dllexport)</font></p>
<p><font face="Courier New"><font size="2"><font color="#006600">// 宣言<br />
// フック開始用</font><br />
DLLEXPORT void HookStart(void);<br />
</font></font><font face="Courier New"><font size="2"><font color="#006600">// フック停止用<br />
</font>DLLEXPORT void HookStop(void);<br />
<font color="#006600">// フック処理用 DLLにする事によってグローバルフックが出来るようになります</font><br />
DLLEXPORT LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam);</font></font></p>
<p><font face="Courier New"><font size="2"><font color="#006600">//---------------------------------------------------------------------------<br />
// 必ず初期化しないと動いてくれない<br />
</font>#pragma data_seg(&quot;.shared&quot;)<br />
HHOOK g_hHook = NULL;&nbsp;&nbsp; </font></font><font face="Courier New"><font size="2"><font color="#006600">// フックハンドル<br />
</font>#pragma data_seg()<br />
#pragma comment(linker, &quot;/section:.shared,rws&quot;)</font></font></p>
<p><font face="Courier New" size="2">HINSTANCE g_hInst;</font></p>
<p><font face="Courier New" size="2"></font></p>
<p><font face="Courier New" size="2"></font></p>
<p><font face="Courier New"><font size="2"><font color="#006600">//---------------------------------------------------------------------------<br />
// DLLエントリポイント<br />
</font>BOOL APIENTRY DllMain(HANDLE hModule, DWORD&nbsp; ul_reason_for_call, LPVOID lpReserved)<br />
{<br />
&nbsp;&nbsp;&nbsp; if ( ul_reason_for_call == DLL_PROCESS_ATTACH ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_hInst = (HINSTANCE)hModule;&nbsp;&nbsp; // DLLモジュールのハンドル取得<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; return TRUE;<br />
}<br />
</font></font><font face="Courier New"><font size="2"><font color="#006600">//---------------------------------------------------------------------------<br />
// フック開始</font><br />
DLLEXPORT void HookStart()<br />
{<br />
&nbsp;&nbsp;&nbsp; g_hHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseProc, g_hInst, 0);</font></font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; if ( g_hHook == NULL ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox(NULL, &quot;フック開始は失敗しました&quot;, &quot;HookStart&quot;, MB_OK);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; MessageBox(NULL, &quot;フック開始は成功しました&quot;, &quot;HookStart&quot;, MB_OK);<br />
}<br />
</font><font face="Courier New"><font size="2"><font color="#006600">//---------------------------------------------------------------------------<br />
// フック処理</font><br />
DLLEXPORT LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam)<br />
{<br />
&nbsp;&nbsp;&nbsp; char sMsg[100];&nbsp;&nbsp;&nbsp;&nbsp; <font color="#006600">// メッセージ表示用</font></font></font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// この構造体から位置,ハンドル,ヒットテストコード,追加情報を取得出来ます</font><br />
&nbsp;&nbsp;&nbsp; MOUSEHOOKSTRUCT *mmsg;&nbsp; </font></p>
<p><font face="Courier New"><font size="2"><font color="#006600">&nbsp;&nbsp;&nbsp; // lParamをMOUSEHOOKSTRUCT型でキャストし<br />
&nbsp;&nbsp;&nbsp; // 構造体のメンバを指定出来るようにします</font><br />
&nbsp;&nbsp;&nbsp; mmsg = (MOUSEHOOKSTRUCT *)lParam;</font></font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; if ( code &lt; 0 ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return CallNextHookEx(g_hHook, code, wParam, lParam);<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;<font color="#006600">&nbsp; // 今回は右クリックと位置を確認します</font><br />
&nbsp;&nbsp;&nbsp; if ( wParam == WM_RBUTTONDOWN ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wsprintf(sMsg, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;位置 X : %d, Y : %d で\r\n右クリックされました!&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , mmsg-&gt;pt.x, mmsg-&gt;pt.y);</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox(mmsg-&gt;hwnd, sMsg, &quot;MouseProc&quot;, MB_OK);<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Courier New"><font size="2"><font color="#006600">&nbsp;&nbsp;&nbsp; // 最大化ボタン上かどうかも確認してみます<br />
&nbsp;&nbsp;&nbsp; // マウスカーソルを最大化ボタン上に持っていくとメッセージが表示されます<br />
</font>&nbsp;&nbsp;&nbsp; if ( mmsg-&gt;wHitTestCode == HTMAXBUTTON ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox(mmsg-&gt;hwnd, &quot;最大化ボタン!&quot;, &quot;MouseProc&quot;, MB_OK);<br />
&nbsp;&nbsp;&nbsp; }</font></font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; </font><font face="Courier New"><font size="2"><font color="#006600">// 最後は次のフックへ渡します<br />
</font>&nbsp;&nbsp;&nbsp; return CallNextHookEx(g_hHook, code, wParam, lParam);<br />
}<br />
</font></font><font face="Courier New"><font size="2"><font color="#006600">//---------------------------------------------------------------------------<br />
// フック停止<br />
</font>DLLEXPORT void HookStop(void)<br />
{<br />
&nbsp;&nbsp;&nbsp; BOOL bResult;</font></font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; if ( g_hHook == NULL ) return;</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; bResult = UnhookWindowsHookEx(g_hHook);<br />
&nbsp;&nbsp;&nbsp; if ( bResult == 0 ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox(NULL, &quot;フック解除は失敗しました&quot;, &quot;HookStop&quot;, MB_OK);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; MessageBox(NULL, &quot;フック解除は成功しました&quot;, &quot;HookStop&quot;, MB_OK);<br />
}<br />
<font color="#006600">//---------------------------------------------------------------------------</font></font></p>
<p><font face="Courier New" size="2">と、まぁどうすかね。<br />
SetWindowsHookExの第1引数をWH_MOUSEに変更してある点、<br />
MOUSEHOOKSTRUCT型による、マウス座標やヒットテストコードの取得<br />
この辺りが、キーボードフックと異なる点です。</font></p>
<p><font face="Courier New" size="2">ここでひとつ。<br />
MessageBoxで確認をしていますが、コードの書き方がマズイと<br />
大量のMessageBoxが出現し、どうにもならなくなってしまう場合がありますので<br />
その辺、上手くやるなりなんなりで注意してください。</font></p>
<p><font face="Courier New" size="2">・参考<br />
typedef struct tagMOUSEHOOKSTRUCT {&nbsp;<br />
&nbsp;&nbsp;&nbsp; POINT pt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;pt.x&nbsp; pt.y&nbsp; マウスのスクリーン座標<br />
&nbsp;&nbsp;&nbsp; HWND&nbsp; hwnd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;メッセージを受け取ったウィンドウのハンドル<br />
&nbsp;&nbsp;&nbsp; UINT&nbsp; wHitTestCode;&nbsp;&nbsp;&nbsp;&nbsp;// ヒットテストコード<br />
&nbsp;&nbsp;&nbsp; DWORD dwExtraInfo;&nbsp;&nbsp;&nbsp;&nbsp; // 追加情報<br />
} MOUSEHOOKSTRUCT; <br />
<br />
ヒットテストコードにはマウスカーソルがどの位置にあるのか等の<br />
情報が入ります。(タイトルバー、クライアント領域、閉じるボタン上など)<br />
MSDN「WM_NCHITTES」にて説明があります。</font></p>]]>
    </description>
    <category>Programing</category>
    <link>https://lresult.blog.shinobi.jp/programing/%E3%83%9E%E3%82%A6%E3%82%B9%E3%81%AE%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E3%83%95%E3%83%83%E3%82%AF%E3%80%80dll%E5%81%B4</link>
    <pubDate>Thu, 16 Nov 2006 16:21:57 GMT</pubDate>
    <guid isPermaLink="false">lresult.blog.shinobi.jp://entry/8</guid>
  </item>
    <item>
    <title>キーボードのグローバルフック　アプリ側</title>
    <description>
    <![CDATA[<p><font face="Courier New" size="2">キーボードのグローバルフックの続き。<br />
DLL側はVC6で作成したので、今度は呼び出し(アプリ)側をBCBで。<br />
今回は、コンストラクタでDLLを読み込み、フォームを閉じる前に解放するコード</font></p>
<p><font face="Courier New" size="2">少しややこしいのは、関数ポインタの宣言とか、<br />
GetProcAddressにて関数のアドレスをゲットするとことか。</font></p>
<p><font face="Courier New" size="2"><br />
</font><font face="Courier New" size="2">・ローカルフックと同様に、Buttonコンポーネントの&quot;HookStartBtn&quot;, &quot;HookStopBtn&quot;を<br />
　設置し、作成したDLLを同じフォルダに置いてから...</font></p>
<p><font face="Courier New" size="2"><font face="Courier New"><font size="2"><font style="BACKGROUND-COLOR: #ffff99">&lt;Unit1.h&gt;</font><br />
<font color="#006600">//---------------------------------------------------------------------------</font></font></font></font></p>
<p><font face="Courier New" size="2">#ifndef Unit1H<br />
#define Unit1H<br />
<font color="#006600">//---------------------------------------------------------------------------</font><br />
#include &lt;Classes.hpp&gt;<br />
#include &lt;Controls.hpp&gt;<br />
#include &lt;StdCtrls.hpp&gt;<br />
#include &lt;Forms.hpp&gt;<br />
<font color="#006600">//---------------------------------------------------------------------------</font><br />
class TForm1 : public TForm<br />
{<br />
__published:&nbsp;// IDE 管理のコンポーネント<br />
&nbsp;&nbsp;&nbsp; TButton *HookStartBtn;<br />
&nbsp;&nbsp;&nbsp; TButton *HookStopBtn;<br />
&nbsp;&nbsp;&nbsp; void __fastcall HookStartBtnClick(TObject *Sender);<br />
&nbsp;&nbsp;&nbsp; void __fastcall HookStopBtnClick(TObject *Sender);<br />
&nbsp;&nbsp;&nbsp; void __fastcall FormClose(TObject *Sender, TCloseAction &amp;Action);</font></p>
<p><font face="Courier New" size="2">private:&nbsp;// ユーザー宣言</font></p>
<p><font face="Courier New" color="#800000" size="2">&nbsp;&nbsp;&nbsp; // DLLのインスタンスハンドル<br />
&nbsp;&nbsp;&nbsp; HINSTANCE m_hInst;</font></p>
<p><font face="Courier New" color="#800000" size="2">&nbsp;&nbsp;&nbsp; // DLL関数呼び出し用の関数ポインタ宣言<br />
&nbsp;&nbsp;&nbsp; __declspec(dllexport)void (*HookStart)(void);&nbsp;&nbsp; // フック開始呼び出し用<br />
&nbsp;&nbsp;&nbsp; __declspec(dllexport)void (*HookStop)(void);&nbsp;&nbsp;&nbsp; // フック停止呼び出し用</font></p>
<p><font face="Courier New" size="2">public:&nbsp;&nbsp;// ユーザー宣言<br />
&nbsp;&nbsp;&nbsp; __fastcall TForm1(TComponent* Owner);</font></p>
<p><font face="Courier New" size="2">};<br />
//---------------------------------------------------------------------------<br />
extern PACKAGE TForm1 *Form1;<br />
//---------------------------------------------------------------------------<br />
#endif<br />
</font></p>
<p><font face="Courier New" size="2"><font style="BACKGROUND-COLOR: #ffff99">&lt;Unit1.cpp&gt;</font><br />
<font color="#006600">//---------------------------------------------------------------------------</font></font></p>
<p><font face="Courier New" size="2">#include &lt;vcl.h&gt;<br />
#pragma hdrstop</font></p>
<p><font face="Courier New" size="2">#include &quot;Unit1.h&quot;<br />
//---------------------------------------------------------------------------<br />
#pragma package(smart_init)<br />
#pragma resource &quot;*.dfm&quot;<br />
TForm1 *Form1;<br />
<font color="#006600">//---------------------------------------------------------------------------<br />
// コンストラクタ</font><br />
__fastcall TForm1::TForm1(TComponent* Owner)<br />
&nbsp;&nbsp;&nbsp; : TForm(Owner)<br />
{<br />
&nbsp;&nbsp;&nbsp; <font color="#006600">// DLLの読み込み<br />
</font>&nbsp;&nbsp;&nbsp; m_hInst = LoadLibrary(&quot;KeybdHook.dll&quot;);<br />
&nbsp;&nbsp;&nbsp; <font color="#006600">// エラー処理</font><br />
&nbsp;&nbsp;&nbsp; if ( m_hInst == NULL ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowMessage(&quot;KeybdHook.dll:読込失敗しました&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// DLL関数のアドレスを取得<br />
</font>&nbsp;&nbsp;&nbsp; HookStart = (void (*)(void))GetProcAddress(m_hInst, &quot;HookStart&quot;);<br />
&nbsp;&nbsp;&nbsp; HookStop&nbsp; = (void (*)(void))GetProcAddress(m_hInst, &quot;HookStop&quot; );<br />
&nbsp;&nbsp;&nbsp; <font color="#006600">// エラー処理</font><br />
&nbsp;&nbsp;&nbsp; if ( HookStart == NULL || HookStop == NULL ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowMessage(&quot;関数のアドレス取得に失敗しました&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FreeLibrary(m_hInst);&nbsp;&nbsp; <font color="#006600">// 読み込んだDLLを解放<br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_hInst = NULL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<font color="#006600">//---------------------------------------------------------------------------<br />
// APP側フック開始</font><br />
void __fastcall TForm1::HookStartBtnClick(TObject *Sender)<br />
{<br />
&nbsp;&nbsp;&nbsp; HookStart();<br />
}<br />
<font color="#006600">//---------------------------------------------------------------------------<br />
// APP側フック停止</font><br />
void __fastcall TForm1::HookStopBtnClick(TObject *Sender)<br />
{<br />
&nbsp;&nbsp;&nbsp; HookStop();<br />
}<br />
<font color="#006600">//---------------------------------------------------------------------------<br />
// フォームを閉じた</font><br />
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &amp;Action)<br />
{<br />
&nbsp;&nbsp;&nbsp; // DLLの解放<br />
&nbsp;&nbsp;&nbsp; if ( m_hInst != NULL ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FreeLibrary(m_hInst);&nbsp;&nbsp; <font color="#006600">// 読み込んだDLLを解放</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_hInst = NULL;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<font color="#006600">//---------------------------------------------------------------------------</font></font></p>
<p><font face="Courier New"><font size="2">と、まぁどんなもんでしょうか。<br />
フック処理は全てDLLで実施している為、アプリ側では呼び出しているだけ。</font></font></p>
<p><font face="Courier New"><font size="2">ここまで敢えて&quot;HookStopBtn&quot;でフック解除を行ってきたが<br />
普通はデストラクタやClose()イベントで解除するもんだと思う。</font></font></p>
<p><font face="Courier New"><font size="2">また、実行してみると分かるが、メッセージボックスが2回表示されますな。<br />
これは、KeyDownとKeyUpで2回呼ばれている為、lParamからどちらなのか判断します。</font></font></p>
<p><font face="Courier New"><font size="2">if ( (lParam &amp; 0x80000000) == 0 )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // KeyUp<br />
else if ( (lParam &amp; 0x80000000) == 1 )&nbsp; // KeyDown</font></font></p>
<p><font face="Courier New"><font size="2">こんな感じで。</font><font face="Courier New"><font size="2"></font></font></font></p>
<font face="Courier New" size="2"></font>]]>
    </description>
    <category>Programing</category>
    <link>https://lresult.blog.shinobi.jp/programing/%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AE%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E3%83%95%E3%83%83%E3%82%AF%E3%80%80%E3%82%A2%E3%83%97%E3%83%AA%E5%81%B4</link>
    <pubDate>Sun, 12 Nov 2006 14:15:40 GMT</pubDate>
    <guid isPermaLink="false">lresult.blog.shinobi.jp://entry/7</guid>
  </item>
    <item>
    <title>キーボードのグローバルフック　DLL側</title>
    <description>
    <![CDATA[<p><font face="Courier New" size="2">今度は、キーボードのグローバルフックを試してみる<br />
グローバルフックするにはDLLにてフックプロシージャを実行する必要がある<br />
ただ・・問題が1つ。。<br />
<br />
プロセス間で使えるグローバル変数は共有セグメントってのに確保せねばならんらしい。<br />
ただ、BCBで実現しようとするとアセンブラやメモリマップト・ファイル(メモリマップド・ファイル？)等が<br />
出てきて、いろいろ面倒らしい上に調べてもサッパリHITせず..。<br />
<br />
というわけで、仕方なくVisual C++ 6.0を使用してDLLを作成。<br />
<font color="#800000">#pragma data_seg(&quot;hoge&quot;) ～ #pragma data_seg()</font>の間で<br />
利用するグローバル変数を宣言し、初期化しなければならない。</font></p>
<p><font face="Courier New" size="2">・[新規作成] &rarr; [プロジェクト]タブ &rarr; Win32 Dynamic-Link Library を選んで<br />
　プロジェクト名 &quot;KeybdHook&quot;で作成してから...</font></p>
<p><font face="Courier New"><font size="2"><font style="BACKGROUND-COLOR: #ffff99">&lt;DLL側　KeybdHook.cpp&gt;</font><br />
</font></font><font face="Courier New" color="#006600" size="2">//---------------------------------------------------------------------------<br />
// KeybdHook.cpp : DLL アプリケーション用のエントリ ポイントを定義します。<br />
//</font></p>
<p><font face="Courier New" size="2">#include &quot;stdafx.h&quot;</font></p>
<p><font face="Courier New" size="2">#define DLLEXPORT extern &quot;C&quot; __declspec(dllexport)</font></p>
<p><font face="Courier New"><font size="2"><font color="#006600">// 宣言<br />
// フック開始用</font><br />
DLLEXPORT void HookStart(void);<br />
<font color="#006600">// フック停止用</font><br />
DLLEXPORT void HookStop(void);<br />
<font color="#006600">// フック処理用 DLLにする事によってグローバルフックが出来るようになります</font><br />
DLLEXPORT LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);</font></font></p>
<p><font face="Courier New"><font size="2"><font color="#006600">//---------------------------------------------------------------------------<br />
// 必ず初期化しないと動いてくれない</font><br />
#pragma data_seg(&quot;.shared&quot;)<br />
HHOOK g_hHook = NULL;&nbsp;&nbsp; <font color="#006600">// フックハンドル</font><br />
#pragma data_seg()<br />
#pragma comment(linker, &quot;/section:.shared,rws&quot;)</font></font></p>
<p><font face="Courier New"><font size="2">HINSTANCE g_hInst;<br />
<font color="#006600">//---------------------------------------------------------------------------</font></font></font></p>
<p><br />
<font face="Courier New"><font size="2"><font color="#006600">//---------------------------------------------------------------------------<br />
// DLLエントリポイント</font><br />
BOOL APIENTRY DllMain(HANDLE hModule, DWORD&nbsp; ul_reason_for_call, LPVOID lpReserved)<br />
{<br />
&nbsp;&nbsp;&nbsp; if ( ul_reason_for_call == DLL_PROCESS_ATTACH ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_hInst = (HINSTANCE)hModule;&nbsp;&nbsp; </font></font><font face="Courier New"><font size="2"><font color="#006600">// DLLモジュールのハンドル取得<br />
</font>&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; return TRUE;<br />
}<br />
</font></font><font face="Courier New"><font size="2"><font color="#006600">//---------------------------------------------------------------------------<br />
// フック開始</font><br />
DLLEXPORT void HookStart()<br />
{<br />
&nbsp;&nbsp;&nbsp; g_hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, g_hInst, 0);</font></font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; if ( g_hHook == NULL ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox(NULL, &quot;フック開始は失敗しました&quot;, &quot;HookStart&quot;, MB_OK);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; MessageBox(NULL, &quot;フック開始は成功しました&quot;, &quot;HookStart&quot;, MB_OK);<br />
}<br />
</font><font face="Courier New"><font size="2"><font color="#006600">//---------------------------------------------------------------------------<br />
// フック処理</font><br />
DLLEXPORT LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)<br />
{<br />
&nbsp;&nbsp;&nbsp; if ( code &lt; 0 ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return CallNextHookEx(g_hHook, code, wParam, lParam);<br />
&nbsp;&nbsp;&nbsp; }</font></font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// 今回も試しにキーボードの[0]と[F2]の押下を確認してみます</font><br />
&nbsp;&nbsp;&nbsp; if ( wParam == 0x30 ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox(NULL, &quot;0押した!&quot;, &quot;KeyboardProc&quot;, MB_OK);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; else if ( wParam == VK_F2 ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox(NULL, &quot;F2押した!&quot;, &quot;KeyboardProc&quot;, MB_OK);<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; return CallNextHookEx(g_hHook, code, wParam, lParam);<br />
}<br />
</font><font face="Courier New"><font size="2"><font color="#006600">//---------------------------------------------------------------------------<br />
// フック停止</font><br />
DLLEXPORT void HookStop(void)<br />
{<br />
&nbsp;&nbsp;&nbsp; BOOL bResult;</font></font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; if ( g_hHook == NULL ) return;</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; bResult = UnhookWindowsHookEx(g_hHook);<br />
&nbsp;&nbsp;&nbsp; if ( bResult == 0 ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox(NULL, &quot;フック解除は失敗しました&quot;, &quot;HookStop&quot;, MB_OK);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Courier New"><font size="2">&nbsp;&nbsp;&nbsp; MessageBox(NULL, &quot;フック解除は成功しました&quot;, &quot;HookStop&quot;, MB_OK);<br />
}<br />
<font color="#006600">//---------------------------------------------------------------------------</font></font></font></p>
<p><font color="#006600"></font><br />
<font face="Courier New" size="2">と、まぁこんな感じで。<br />
DLLという事と、最初の共有セグメントでグローバル変数を宣言すれば<br />
フックの処理の部分はローカルフックとそれほど違いはなさげ。</font></p>
<p><font face="Courier New" size="2">また、BCBでの実装方法をご存知の方がいらっしゃれば教えてください。お願いします、なにとぞ。</font></p>]]>
    </description>
    <category>Programing</category>
    <link>https://lresult.blog.shinobi.jp/programing/%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AE%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E3%83%95%E3%83%83%E3%82%AF%E3%80%80dll%E5%81%B4</link>
    <pubDate>Sun, 12 Nov 2006 13:16:45 GMT</pubDate>
    <guid isPermaLink="false">lresult.blog.shinobi.jp://entry/6</guid>
  </item>
    <item>
    <title>SetWindowsHookEx : キーボードのローカルフック</title>
    <description>
    <![CDATA[<p><font face="Courier New" size="2">キーボードのローカルフックを試してみる<br />
HookStartBtnを押し、フックが成功したら[0]キーか[F2]キーを押して<br />
メッセージを受け取れていることを確認するコード<br />
その後、きちんとHookStopBtnを押してフックを解除してやります。</font></p>
<p><font face="Courier New" size="2">・Form上にButtonコンポーネントの&quot;HookStartBtn&quot;と&quot;HookStopBtn&quot;を配置し<br />
　表示用のEditコンポーネントも配置してから..</font></p>
<p><font face="Courier New" size="2"><font style="BACKGROUND-COLOR: #ffff99">&lt;Unit1.cpp&gt;</font><br />
//---------------------------------------------------------------------------</font></p>
<p><font face="Courier New" size="2">#include &lt;vcl.h&gt;<br />
#pragma hdrstop</font></p>
<p><font face="Courier New" size="2">#include &quot;Unit1.h&quot;<br />
<font color="#006600">//---------------------------------------------------------------------------<br />
</font>#pragma package(smart_init)<br />
#pragma resource &quot;*.dfm&quot;<br />
TForm1 *Form1;</font></p>
<p><font face="Courier New" size="2">// 宣言<br />
HHOOK g_hHook;&nbsp; <font color="#006600">// フックハンドル<br />
// フックプロシージャ: この関数内でパラメータを処理する</font><br />
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);</font></p>
<p><font face="Courier New" size="2"><font color="#006600">//---------------------------------------------------------------------------<br />
</font>__fastcall TForm1::TForm1(TComponent* Owner)<br />
&nbsp;: TForm(Owner)<br />
{<br />
}<br />
<font color="#006600">//---------------------------------------------------------------------------<br />
// フックを開始する</font><br />
void __fastcall TForm1::HookStartBtnClick(TObject *Sender)<br />
{<br />
&nbsp;&nbsp;&nbsp; HINSTANCE hInst;</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// アプリケーションのインスタンスハンドルを取得<br />
</font>&nbsp;&nbsp;&nbsp; hInst = (HINSTANCE)GetWindowLong(Handle, GWL_HINSTANCE);</font></p>
<p><font face="Courier New" size="2">&nbsp;&nbsp;&nbsp; <font color="#006600">// フックをインストールします</font><br />
&nbsp;&nbsp;&nbsp; g_hHook = SetWindowsHookEx(WH_KEYBOARD,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#006600">// 今回はKeyboard<br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (HOOKPROC)KeyboardProc,&nbsp; <font color="#006600">// 処理するための関数</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hInst,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#006600">// インスタンスのハンドル</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#006600">// スレッドのID</font><br />
&nbsp;&nbsp;&nbsp; if ( g_hHook == NULL ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowMessage(&quot;フック開始は失敗しました&quot;);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowMessage(&quot;フック開始は成功しました&quot;);<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<font color="#006600">//---------------------------------------------------------------------------<br />
// フックを処理する</font><br />
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)<br />
{<br />
<font color="#006600">&nbsp;&nbsp;&nbsp; // MSDNには...<br />
&nbsp;&nbsp;&nbsp; // &gt; codeパラメータの値が0未満の場合、フックプロシージャは、<br />
&nbsp;&nbsp;&nbsp; // &gt; それ以上メッセージを処理せず、CallNextHookEx関数にメッセージを渡し、<br />
&nbsp;&nbsp;&nbsp; // &gt; その関数の戻り値を返さなければなりません。<br />
&nbsp;&nbsp;&nbsp; // とあるので返してやります。<br />
</font>&nbsp;&nbsp;&nbsp; if ( code &lt; 0 ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return CallNextHookEx(g_hHook, code, wParam, lParam);<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Courier New" size="2"><font color="#006600">&nbsp;&nbsp;&nbsp; // 今回は試しにキーボードの[0]と[F2]の押下を確認してみます</font><br />
&nbsp;&nbsp;&nbsp; if ( wParam == 0x30 ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Form1-&gt;Edit1-&gt;Text = &quot;0押した!&quot;;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; else if ( wParam == VK_F2 ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Form1-&gt;Edit1-&gt;Text = &quot;F2押した!&quot;;<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Courier New" size="2"><font color="#006600">&nbsp;&nbsp;&nbsp; // MSDNには...<br />
&nbsp;&nbsp;&nbsp; // &gt; codeパラメータの値が0以上かつ、フックプロシージャで<br />
&nbsp;&nbsp;&nbsp; // &gt; メッセージを処理しなかったときは、CallNextHookEx関数を呼び出し、<br />
&nbsp;&nbsp;&nbsp; // &gt; その関数の戻り値を返すことを強く推奨します<br />
&nbsp;&nbsp;&nbsp; // と、、あるので素直に返してやります。</font><br />
&nbsp;&nbsp;&nbsp; return CallNextHookEx(g_hHook, code, wParam, lParam);<br />
}<br />
<font color="#006600">//---------------------------------------------------------------------------<br />
// フックを停止する</font><br />
void __fastcall TForm1::HookStopBtnClick(TObject *Sender)<br />
{<br />
&nbsp;&nbsp;&nbsp; BOOL bResult;<br />
&nbsp;&nbsp;&nbsp; bResult = UnhookWindowsHookEx(g_hHook);<br />
&nbsp;&nbsp;&nbsp; if ( bResult != 0 ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowMessage(&quot;フック解除は成功しました&quot;);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowMessage(&quot;フック解除は失敗しました&quot;);<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<font color="#006600">//---------------------------------------------------------------------------<br />
</font></font></p>
<p><font face="Courier New" color="#808080" size="2">と、まぁこんな感じで。<br />
ローカルフックなので、ほっとんど意味無し。<br />
OnKeyPressイベントでイイんじゃないか、と。</font></p>]]>
    </description>
    <category>Programing</category>
    <link>https://lresult.blog.shinobi.jp/programing/setwindowshookex%20-%20%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AE%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%95%E3%83%83%E3%82%AF</link>
    <pubDate>Sun, 12 Nov 2006 08:54:20 GMT</pubDate>
    <guid isPermaLink="false">lresult.blog.shinobi.jp://entry/5</guid>
  </item>

    </channel>
</rss>