C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: グローバルフック


(過去ログ 85 を表示中)

[トピック内 31 記事 (1 - 20 表示)]  << 0 | 1 >>

■50230 / inTopicNo.1)  グローバルフック
  
□投稿者/ alloc (1回)-(2010/05/31(Mon) 16:08:27)

分類:[C/C++] 

 初めまして。
WH_SHELL のグローバルフックをするツールを作り、スタートアップにリンクファイルおきました。
#レジストリに書く方法でやっても同じでした

XP だと問題なく動きますが、Window7 だと、ほとんどフックできません。
ただ、エクスプローラーなどのシェルからの起動なら、問題なくフックできます。


ワケワカな状態で困っています。
よろしくお願いします。

引用返信 編集キー/
■50241 / inTopicNo.2)  Re[1]: グローバルフック
□投稿者/ 甕星 (10回)-(2010/05/31(Mon) 20:52:59)
管理者権限が無い状態で起動しているか、ChangeWindowMessageFilter APIを呼び出して許可する必要があるか、どちらかじゃないかと思います。
引用返信 編集キー/
■50251 / inTopicNo.3)  Re[2]: グローバルフック
□投稿者/ alloc (2回)-(2010/06/01(Tue) 14:41:36)
No50241 (甕星 さん) に返信

 甕星 さん。
ありがとうございます。
さっそく、後者を実装してみました。


FUNCTYPE pCWMF = (FUNCTYPE)GetProcAddress(LoadLibrary(
	TEXT("user32.dll")), "ChangeWindowMessageFilter");
if (pCWMF) {
	BOOL bRet;
	bRet = pCWMF(HSHELL_WINDOWCREATED, MSGFLT_ADD);
	WriteLog_("CWMF Create: >%d<\n", bRet);
	bRet = pCWMF(HSHELL_WINDOWDESTROYED, MSGFLT_ADD);
	WriteLog_("CWMF Destroy: >%d<\n", bRet);
...

ここらへんは、成功してますが、Window7 でのフックには成功してません。
む〜、困ったもんです。


引用返信 編集キー/
■50258 / inTopicNo.4)  Re[2]: グローバルフック
□投稿者/ Jitta on the way (642回)-(2010/06/01(Tue) 18:49:03)
No50241 (甕星 さん) に返信
> 管理者権限が無い状態で起動しているか、
「スタートアップ」に置くと、管理者権限がなくなりますね、確か。エクスプローラーから起動(して、UACプロンプトに応える)ならイケるという事なので、これの可能性が高いです。

タスクに、「ログオン時に起動」等で登録し、試してみて下さい。
引用返信 編集キー/
■50266 / inTopicNo.5)  Re[3]: グローバルフック
□投稿者/ ちゃっぴ (17回)-(2010/06/02(Wed) 01:50:08)
ちゃっぴ さんの Web サイト
Service にした方がいいんじゃないかなぁ。。。
引用返信 編集キー/
■50286 / inTopicNo.6)  Re[3]: グローバルフック
□投稿者/ alloc (3回)-(2010/06/02(Wed) 13:32:33)
No50258 (Jitta on the way さん) に返信
> 「スタートアップ」に置くと、管理者権限がなくなりますね、確か。エクスプローラーから起動(して、UACプロンプトに応える)ならイケるという事なので、これの可能性が高いです。

 Jitta on the way さん。
ありがとうございます。
私も管理者権限じゃないかと、疑っています。


> タスクに、「ログオン時に起動」等で登録し、試してみて下さい。

 これって、どうやればいいのでしょうか?
具体的に教えていただけると、うれしいです。
引用返信 編集キー/
■50287 / inTopicNo.7)  Re[4]: グローバルフック
□投稿者/ alloc (4回)-(2010/06/02(Wed) 13:40:34)
No50266 (ちゃっぴ さん) に返信
> Service にした方がいいんじゃないかなぁ。。。

 ちゃっぴ さん。
ありがとうございます。
このフックの目的は、特定の msi の起動時にある処理、終了時にある処理をする、
なんです。
サービスは結構面倒なイメージがあるのですが、それも一案かも…?
それとも、いっそのこと、セットアップを作ったほうが早いかもしれません。

まさか、こんな落とし穴があるなんて…


引用返信 編集キー/
■50291 / inTopicNo.8)  Re[5]: グローバルフック
□投稿者/ とっちゃん (513回)-(2010/06/02(Wed) 15:04:58)
とっちゃん さんの Web サイト
No50287 (alloc さん) に返信
> このフックの目的は、特定の msi の起動時にある処理、終了時にある処理をする、
> なんです。

特定のmsiが相手なら、そのmsiをカスタマイズしちゃうほうが楽だと思います。
msiによるので、何とも言えない部分はありますけど。。。

引用返信 編集キー/
■50292 / inTopicNo.9)  Re[6]: グローバルフック
□投稿者/ alloc (5回)-(2010/06/02(Wed) 18:34:26)
No50291 (とっちゃん さん) に返信

> 特定のmsiが相手なら、そのmsiをカスタマイズしちゃうほうが楽だと思います。
> msiによるので、何とも言えない部分はありますけど。。。

 とっちゃん さん。
ありがとうございます。

msiのカスタマイズは、その都度、やらなくちゃならない、ですよね?
今、.Net でベータ版の開発中でして、日に2〜3回作らされることもあるんですよ…

フックでやることは、簡単です。
起動時に必要があれば、指定のプロセスを殺す、終了時にファイルをコピーする、だけ。

引用返信 編集キー/
■50295 / inTopicNo.10)  Re[7]: グローバルフック
□投稿者/ とっちゃん (514回)-(2010/06/03(Thu) 01:22:42)
とっちゃん さんの Web サイト
No50292 (alloc さん) に返信
> msiのカスタマイズは、その都度、やらなくちゃならない、ですよね?
> 今、.Net でベータ版の開発中でして、日に2〜3回作らされることもあるんですよ…
>
文言通りだとすると、開発中のアプリがあって、そのインストーラを作っていて
インストールするときにいちいちインストールしたアプリを終わらないといけなくて。。。

ということ?


日に何回かインストーラまでビルドする必要があって、その都度カスタマイズは面倒?

最終的に出来上がったものにそのような機能は不要なのであれば
テスト中はこのEXEから実行してね。。
とフックの代わりに前後で行いたい作業をするEXEを作ってその中からインストーラを
実行すればよいのでは?

それなら、インストーラを配る範囲が変わっても仕込みを入れる必要もないし
環境依存性も低いと思いますよ。

引用返信 編集キー/
■50297 / inTopicNo.11)  Re[8]: グローバルフック
□投稿者/ alloc (6回)-(2010/06/03(Thu) 10:14:04)
No50295 (とっちゃん さん) に返信

 おはようございます。

> 文言通りだとすると、開発中のアプリがあって、そのインストーラを作っていて
> インストールするときにいちいちインストールしたアプリを終わらないといけなくて。。。

 ん〜と、常駐ソフトを殺しにいきます。生きていればの話ですが。
なんとならば、このソフトは msi に含まれているから。
#最新版だと、自分の判断で終了するので、この必要はないのですが


> とフックの代わりに前後で行いたい作業をするEXEを作ってその中からインストーラを
> 実行すればよいのでは?

 元々はこの方法を考えていたのですが、複数の主な開発者との調整とフックを天秤にかけ、
後者を選択したわけです。
だって、簡単にできる、と思うでしょ、普通。実際、簡単にできましたし。
まさか、この手の落とし穴があるとは…、その時点では予測不可能でした。

そうそう、不思議なことがあります。
秀丸、ペイントとかは、フックできます。

引用返信 編集キー/
■50298 / inTopicNo.12)  Re[4]: グローバルフック
□投稿者/ Jitta (646回)-(2010/06/03(Thu) 10:34:17)
No50286 (alloc さん) に返信

>>タスクに、「ログオン時に起動」等で登録し、試してみて下さい。
>
>  これって、どうやればいいのでしょうか?
> 具体的に教えていただけると、うれしいです。

 Vista で説明します。違っていれば同じような項目を探してください。

コントロールパネルを開きます。
「システムとメンテナンス」→「管理ツール」と進みます。
「タスク スケジューラ」を起動します。(UAC プロンプトが出ます)
右の方に「操作」タブがあり、そこに「タスクの作成」があると思います。ない場合は、「操作」メニューから「タスクの作成」を選択します。
「全般」タブ:
 「名前」を適当に入力します。
 「最上位の特権で実行する」をチェックします。
「トリガー」タブ:
 「新規」ボタンをクリックします。
 「タスクの開始」を「ログオン時」にします。
 「設定」グループで、適切なアカウントを設定します。
 「詳細設定」グループで、「有効」をチェックします。
「操作」タブ:
 「新規」ボタンをクリックします。
 「操作」に、「プログラムの開始」を選択します。
 「設定」グループで、「プログラム/スクリプト」に、対象のプログラムを設定します。
 その他、オプションを設定します。
その他のタブ:
 適切に設定します。

引用返信 編集キー/
■50301 / inTopicNo.13)  Re[9]: グローバルフック
□投稿者/ 渋木宏明(ひどり) (1349回)-(2010/06/03(Thu) 11:32:27)
渋木宏明(ひどり) さんの Web サイト
> そうそう、不思議なことがあります。
> 秀丸、ペイントとかは、フックできます。

そういうもんなんです。

未昇格のプロセスから昇格済みのプロセスのメッセージフックは出来ない、という仕様で、Vista のリリース前から情報公開されています。

引用返信 編集キー/
■50304 / inTopicNo.14)  Re[9]: グローバルフック
□投稿者/ とっちゃん (515回)-(2010/06/03(Thu) 12:12:54)
とっちゃん さんの Web サイト
No50297 (alloc さん) に返信

常駐アプリを製作中で
古いバージョンだと自分を終了する手段を持っていなくて
インストーラから終了させる段取りを組み入れたい

ということですか?
最新版に入れ替えとけ!でおしまいじゃ?
運用回避といういい方もありますが、開発途中のものにそこまで
コストかける意味があるの?と思ってしまう。。。

>  元々はこの方法を考えていたのですが、複数の主な開発者との調整とフックを天秤にかけ、
> 後者を選択したわけです。
> だって、簡単にできる、と思うでしょ、普通。実際、簡単にできましたし。

グローバルフックをかけるということを簡単にできると思う人なら、
VSセットアップなんてバギーなものを使わず、WiXなりを使ったほうが
よっぽど効率いいと思いますけど?


> まさか、この手の落とし穴があるとは…、その時点では予測不可能でした。
>
> そうそう、不思議なことがあります。
> 秀丸、ペイントとかは、フックできます。
>
そうすれば、この辺にあるようなことなんて一切考える必要ないし。

引用返信 編集キー/
■50306 / inTopicNo.15)  Re[5]: グローバルフック
□投稿者/ alloc (7回)-(2010/06/03(Thu) 13:48:54)
No50298 (Jitta さん) に返信

>  Vista で説明します。違っていれば同じような項目を探してください。

 お見事!
ありがとうございます。
パーペキにmsiのフックができています。


引用返信 編集キー/
■50308 / inTopicNo.16)  Re[10]: グローバルフック
□投稿者/ alloc (8回)-(2010/06/03(Thu) 13:55:19)
No50301 (渋木宏明(ひどり) さん) に返信


> そういうもんなんです。
>
> 未昇格のプロセスから昇格済みのプロセスのメッセージフックは出来ない、という仕様で、Vista のリリース前から情報公開されています。

 ありがとうございます。
皆さんに色々教えてもらって、だんだん分かってきました。
恐るべしUAC☆が。

厚かましいお願いですが、ここは参考になるよ、つうURLなどを教えていただけるとうれしいです。



引用返信 編集キー/
■50309 / inTopicNo.17)  Re[6]: グローバルフック
□投稿者/ ちゃっぴ (18回)-(2010/06/03(Thu) 14:01:24)
ちゃっぴ さんの Web サイト
Update install が目的なら素直に installer でやらせるべきでしょうね。

大本の installer の process が昇格しているのであれば普通に対象の process を停止させる処理書けばいいと思いますし、大本の installer の process が昇格していないならその処理を昇格して実施するように manifest つければいいでしょうし。

なお、強制的に落として問題無いんですかね?
対象の process を利用中ですぐに落としてはまずい場合も考えられますし、対象の process が別の user のものである可能性も。この手の処理では停止してくださいと dialog 出すとか、次回再起動時に更新するのが一般的ですが。
引用返信 編集キー/
■50311 / inTopicNo.18)  Re[7]: グローバルフック
□投稿者/ ちゃっぴ (19回)-(2010/06/03(Thu) 14:08:29)
ちゃっぴ さんの Web サイト
ちなみに ORCA でもこんな感じで自動化できると思うんですが。

ORCA で変更した Windows Installer Database への変更を自動化する方法
http://blogs.wankuma.com/tyappi/archive/2009/02/08/167705.aspx
引用返信 編集キー/
■50312 / inTopicNo.19)  Re[11]: グローバルフック
□投稿者/ 渋木宏明(ひどり) (1350回)-(2010/06/03(Thu) 14:22:08)
渋木宏明(ひどり) さんの Web サイト
> 厚かましいお願いですが、ここは参考になるよ、つうURLなどを教えていただけるとうれしいです。

ググればすぐ見つかると思うけど…

解説は WikiPedia にもあるし、正規の情報は MSDN に収録されています。

http://www.google.co.jp/search?hl=ja&q=UAC+wikipedia&lr=lang_ja

http://www.google.co.jp/search?hl=ja&q=UAC+msdn&lr=lang_ja
引用返信 編集キー/
■50314 / inTopicNo.20)  Re[11]: グローバルフック
 
□投稿者/ todo (11回)-(2010/06/03(Thu) 14:32:32)
> 厚かましいお願いですが、ここは参考になるよ、つうURLなどを教えていただけるとうれしいです。

ユーザー インターフェイス特権の分離 (UIPI)
http://www.google.com/search?q=UIPI&hl=ja&sitesearch=microsoft.com&lr=lang_ja
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -