- PR -

C# グローバルフックでメッセージを編集して送り返す。

投稿者投稿内容
有末 清華
ベテラン
会議室デビュー日: 2006/10/09
投稿数: 52
お住まい・勤務地: 北海道
投稿日時: 2007-01-24 20:34
MicrosoftはC#ではグローバルフックできないっていってますがうそです、できます。

まぁそれは置いといて。

いまグローバルフックをしたときに受け取ったメッセージを横取りして編集して右クリックをできないようにしようとしています、いかがコードです。

コード:

public void Install()
{
// Create an instance of HookProc.
MouseHookProcedure = new HookProc(MouseHookProc);
//install hook
hMouseHook = SetWindowsHookEx(
WH_MOUSE_LL,
MouseHookProcedure,
Marshal.GetHINSTANCE(
Assembly.GetExecutingAssembly().GetModules()[0]),
0);
//If SetWindowsHookEx fails.
if (hMouseHook == 0)
{
//Returns the error code returned by the last unmanaged function called using platform invoke that has the DllImportAttribute.SetLastError flag set.
int errorCode = Marshal.GetLastWin32Error();
//do cleanup
Uninstall(false);
//Initializes and throws a new instance of the Win32Exception class with the specified error.
throw new Win32Exception(errorCode);
}
}

// void MouseHookProcの中
if(messageDisable)
{
PostMessage(IntPtr.Zero,0,wParam,lParam);
//call next hook
CallNextHookEx(hMouseHook, nCode, wParam, lParam);
return 0;
}
else
{

return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}



messageDisableがTrueの場合にはコマンドを0としてポストして右クリックを無効化したいんですがうまくいきません。(WM_RBUTTONUPが含まれている場合にmessageDisableがtrueになる)

ご意見よろしくお願いします。

Reference:
ローカルフック:
http://www.kab-studio.biz/Programing/Codian/DLL_Hook_SClass/07.html

グローバルフック:
http://www.kab-studio.biz/Programing/Codian/DLL_Hook_SClass/08.html


_________________
9uiet design( http://quietdesign.rental.allinoneserver.net/ ) - タブ型デスクトップガジェット開発中。Pluginの開発してくれると嬉しいかも。

[ メッセージ編集済み 編集者: 有末 清華 編集日時 2007-01-24 20:36 ]
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-01-25 12:08
引用:

MicrosoftはC#ではグローバルフックできないっていってますがうそです、できます。



どこかで「全面的にできない」とドキュメントしてましたっけ?

もしあれば、出来るだけフィードバックしてあげてください。
(でないといつまでたっても直らないので)

ただし、「全く問題が無い」わけでもありません。
「低レベルフックしか正しく動作しない」という大きな制約が存在します。

なお、低レベルフック「なら」動作するであろうコトは、SetWindowsHookEx() のヘルプの記述から推測することが可能だったような気がします。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2007-01-25 12:34
低レベルフックではメッセージの編集はできません。
ただ CallNextHookEx を呼び出さないことでそれ以上メッセージが先に伝わるのを妨害することはできます。
有末 清華
ベテラン
会議室デビュー日: 2006/10/09
投稿数: 52
お住まい・勤務地: 北海道
投稿日時: 2007-01-25 20:26
> どこかで「全面的にできない」とドキュメントしてましたっけ?
たしかC#でのフックの場面に.netではグローバルフックを受け付けないと書いてありました。

>ただ CallNextHookEx を呼び出さないことでそれ以上メッセージが先に伝わるのを妨害することはできます。
それを行ってみたのですがどうもうまくいきません。→マウスボタンが押されているときのreturnを0でもCalNextHookExの戻り値でもなくしてやるとできたんですが、タスクバーやいくつかのウィンドウがクリックできなくなりました(低レベルフックを使っててフックチェーンが壊れたためだと思ってますが・・・)
_________________
有末 清華
crazy(){for;;{you();}} - プログラマの覚書
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-01-26 10:14
引用:

> どこかで「全面的にできない」とドキュメントしてましたっけ?
たしかC#でのフックの場面に.netではグローバルフックを受け付けないと書いてありました。



その記述のある文書の、URL を教えてください。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2007-01-26 12:38
いつもお世話になっております、

>その記述のある文書の、URL を教えてください。

これのことではないでしょうか?

http://support.microsoft.com/kb/318804/ja

グローバル フックは .NET Framework ではサポートされていない

以前、私もC#でできるか調査していたところ、
本記述でやめた経緯があります。

以上です。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-01-26 13:41
引用:

Makotoさんの書き込み (2007-01-26 12:38) より:
いつもお世話になっております、

>その記述のある文書の、URL を教えてください。

これのことではないでしょうか?

http://support.microsoft.com/kb/318804/ja

グローバル フックは .NET Framework ではサポートされていない

以前、私もC#でできるか調査していたところ、
本記述でやめた経緯があります。

以上です。


Microsoft.NET Frameworkではね。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-01-26 13:50
引用:

これのことではないでしょうか?

http://support.microsoft.com/kb/318804/ja



なるほどー、明言しちゃってるから例外があることは分からないですね。
ということで、一応通報しておきました。

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