プラグイン集

無料ブログはココログ
2021年11月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        

サンプルJS

  • ユーロバカ一代の締切
    ・・・初期化中・・・

« 情けのループ | トップページ | CentOSでマインクラフトのクライアントを動かす »

2013年2月11日 (月)

管理者権限で動くプログラムにD&D出来るようにする

GUIのプログラム書いてて、Vista以降困るなぁと思っていた問題。

特権で動作しているプログラムにドラッグ&ドロップ(以下D&D)が出来ない。

windowsフォルダー以下のファイル見たいなって時は、エディタを特権で動かして、ファイルメニューなり、開くボタンなりを押して、CommonDialogを使ってファイルを探す。

実に面倒くさい。

プログラム作る方としても、D&Dでしてもらったほうが楽だったり、画面を汚さなかったり、開く・終了しかないメニューバーを作らなくていいので、メリットがある。

セキュリティとしてみれば、特権奪取されかねない危険行為なのは分かるけどね。


本題、C++の場合。

ウインドウプロシージャーやメッセージ管理とか自前で管理だから、ドロップのメッセージを処理する従来のコードを記述する。

そして、ChangeWindowMessageFilter関数で、WM_DROPFILES, true と 0x0049, true 後なんだっけ?WM_COPYDATA, trueとかすればいいんだっけ。

このあたりしておくと、盾マークソフトを作っても、D&Dが出来る。

C++の参考:http://helgeklein.com/blog/2010/03/how-to-enable-drag-and-drop-for-an-elevated-mfc-application-on-vistawindows-7/

以上、C++。


難題、VBの場合。

プロシージャーやメッセージは.NET FreamWorkが良きに計らってくれる。その楽をすてて、C++と同様に全部自前でやる。

とりあえず、C++と同じく ChangeWindowMessageFilter呼んで、必要なメッセージ通す。
でも.NETのDragEnterもDragDropも仕事をしない。

なので、AllowDropのプロパティーをfalseにして、.NET管理からはずす。

あとは、C++と同様に、WinProc作って、ドロップのメッセージを処理する。

その際、デリゲートがガベッジコレクト(GC)されないようにする。しばらくDLL使わないと、GCされる。

http://www.mpgh.net/forum/33-visual-basic-programming/571955-run-administrator-prevents-drag-drop-working.html

上のURLの下のほうにあるコードを借りる手もある。

上手くいかなかった:http://homepage2.nifty.com/nonnon/SoftSample/VB.NET/SampleFileDrop.html、後2つあったけど忘れた。

URLのタイプだとGCされたり、NULLリファレンスになる。


ここまでコアなことをしだすとVBよりC++のほうが融通が利いてくる。

「CallbackOnCollectedDelegate が検出されました。」とか、「System.NullReferenceException はハンドルされませんでした。」がどこで起こってるか、アンマネージドコードが増えて分からない。

マルチスレッド化すると、バックグランドスレッドが、フォアグランドにブロックされる現象は、UIPIと関係が有るのだろうか?
ここが解決すると、電DローダーのWindows7上での動作がより快適になるんだが。

« 情けのループ | トップページ | CentOSでマインクラフトのクライアントを動かす »

プログラミング」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 管理者権限で動くプログラムにD&D出来るようにする:

« 情けのループ | トップページ | CentOSでマインクラフトのクライアントを動かす »