- PR -

システムフックのプログラムがMeで動きません

投稿者投稿内容
Kuma
ベテラン
会議室デビュー日: 2001/12/20
投稿数: 66
投稿日時: 2005-07-05 14:34
VS.NET 2003 のVC++の話題ですが。

以下のサイトを参考にキーボードフックのプログラムを作成しました。

http://www.kab-studio.biz/Programing/Codian/DLL_Hook_SClass/08.html

2000やXpでは無事動いたのですが、Meで動作確認したところ、ローカルフックの如く自分自身しかフックしません。
色々調べてみて入るのですが、前述サイトと同様の記述は見つかるのですが、9X系は特殊であるという記述が見つけられません。
9X系で実現するためには、どうのような追加設定が必要なんでしょうか?
Kuma
ベテラン
会議室デビュー日: 2001/12/20
投稿数: 66
投稿日時: 2005-07-06 17:59
自己レスです。

アップ後調査の追加情報をあげます。
同一ソースで以下の環境で差が出ました。

IDE / OS | Xpで実行 | Meで実行
------------------------------------------------------
 VC++.NET 2003 / Windows XP Pro | ○ | ×
 VC++ 6.0 / Windows XP Pro | ○ | ×
 VC++ 6.0 / Windows Me | ○ | ○

開発環境のOSに依存しているようです。
VC++.NETコンパイル・リンク時にMe用も動作するためのオプションスイッチがあるのでしょうか?

VC++.NETは9X系では動作しないが、作成したモジュールは98・Meでは動くとMSのサイトには書いてあったのですが...
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-07-06 20:19
 Win32APIを使っているからでしょう。UNICODE版をバインドしているんじゃないかなぁ?
_________________
Kuma
ベテラン
会議室デビュー日: 2001/12/20
投稿数: 66
投稿日時: 2005-07-07 09:32
Jittaさん、返答ありがとうございます。

引用:

Jittaさんの書き込み (2005-07-06 20:19) より:
 Win32APIを使っているからでしょう。UNICODE版をバインドしているんじゃないかなぁ?




プロジェクトのプロパティーの「文字セット」で見てみると、「マルチバイト文字セットを使用する」になっています。
他のオプションも見てみましたが、それらしい設定部分は見つけられませんでした。

また、ディバッカで確認したところ、UNICODE は define されていませんでした。
ということは、ANSII版がリンクされていると思うのですが。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-07-07 13:08
Kumaさん、こんにちは。

基本的に、開発環境と稼働環境は揃えた方が良いっすよ。
特に NT 系と(16bit OS の 32bit 拡張みたいな)9x 系なんて、別モンな訳ですし。
Kuma
ベテラン
会議室デビュー日: 2001/12/20
投稿数: 66
投稿日時: 2005-07-11 09:03
きくちゃんさん、こんにちは。
返答遅くなりました。

引用:

きくちゃんさんの書き込み (2005-07-07 13:08) より:

基本的に、開発環境と稼働環境は揃えた方が良いっすよ。
特に NT 系と(16bit OS の 32bit 拡張みたいな)9x 系なんて、別モンな訳ですし。




おっしゃることは分かりますが、開発環境に9X系がないのです。
しかしクライアントのマシンはMe...
クライアントマシンはMeでなければ、動かないソフトがあるのでNT系に上げてくれとも言われない。
とりあえず、個人的なマシンを持ち込んで動作チェックを行っています。

とりあえず今回はこの個人マシンで製作して収めるというのが、手っ取り早いかも...
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-07-11 09:40
引用:

2000やXpでは無事動いたのですが、Meで動作確認したところ、ローカルフックの如く自分自身しかフックしません。



具体的に何をフックしていますか?
ローレベルフックは NT 系でしか提供されていませんが、その辺は大丈夫ですか?

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
Kuma
ベテラン
会議室デビュー日: 2001/12/20
投稿数: 66
投稿日時: 2005-07-11 09:52
渋木宏明(ひどり)さん、こんにちは

引用:

渋木宏明(ひどり)さんの書き込み (2005-07-11 09:40) より:

具体的に何をフックしていますか?
ローレベルフックは NT 系でしか提供されていませんが、その辺は大丈夫ですか?




以下ソースを貼り付けますが、キーボードフックを行っています。
SetWindowsHookEx() は、ヘルプを見ると9X系でもサポートしているようですが、このような処理方法がいけないのでしょうか?
もしそうだとすると、Meでコンパイルすると動くというのも不思議です。

---------------------------------------------------
コード:
#include "stdafx.h"

#include <afxdllx.h>
#include "Returnhook.h"

#pragma data_seg(".CRHookData")
HHOOK CReturnHook::m_hHook = NULL;
#pragma data_seg()

static AFX_EXTENSION_MODULE ReturnHookDLL = { NULL, NULL };
static HINSTANCE m_hDllInst = NULL;
HINSTANCE GetThisHInst()
{
return m_hDllInst;
}

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
m_hDllInst = hInstance;

UNREFERENCED_PARAMETER(lpReserved);

if (dwReason == DLL_PROCESS_ATTACH) {
if (!AfxInitExtensionModule(ReturnHookDLL, hInstance))
return 0;

new CDynLinkLibrary(ReturnHookDLL);
} else if (dwReason == DLL_PROCESS_DETACH) {
AfxTermExtensionModule(ReturnHookDLL);
}
return 1; // OK
}

CReturnHook::CReturnHook(void)
{
}

CReturnHook::~CReturnHook(void)
{
ReleaseHook();
}

BOOL CReturnHook::SetHook(void)
{
m_hHook = ::SetWindowsHookEx(
WH_KEYBOARD,
(HOOKPROC)CReturnHook::KeyboardProc,
GetThisHInst(),
0);

return (! m_hHook) ? FALSE : TRUE;
}

BOOL CReturnHook::ReleaseHook(void)
{
BOOL bRes = FALSE;

if (m_hHook) {
bRes = ::UnhookWindowsHookEx(m_hHook);
m_hHook = NULL;
}
return bRes;
}

LRESULT CALLBACK CReturnHook::KeyboardProc(int p_nCode, WPARAM p_wParam, LPARAM p_lParam)
{
if (p_nCode == HC_ACTION) {
if ((p_lParam & 0x80000000L) == 0) { // WM_KEYDOWN
if (p_wParam == VK_RETURN) { // RETURNキー
OutputDebugString("VK_RETURN\n");
AfxMessageBox("VK_RETURN");
return 1;
}
}
}
return ::CallNextHookEx(m_hHook, p_nCode, p_wParam, p_lParam);
}



[ メッセージ編集済み 編集者: Kuma 編集日時 2005-07-11 09:55 ]

スキルアップ/キャリアアップ(JOB@IT)