質問: Windows7 32bit SP1、Visual Studio 2013 Pro にてデスクトップアプリケーションを開発しています。 タグが C# と C++ になっているのは、 最終的には C# での実装を考えているためです。 やりたいことはタイトル通りで、 デスクトップにファイルが追加されると通常は アイコンが左上に詰めるように自動的に配置されますが、 これを右上に詰めるように変更したくて調査しています。 デスクトップアイコンを持つリストビューのウィンドウハンドルの取得と、 アイコンの移動自体は簡単に実現できました。 ``` // hWnd はリストビューのウィンドウハンドル // index は何番目のアイコンなのかを指定 // lParam は移動先の座標 SendMessage(hWnd, LVM_SETITEMPOSITION, index, lParam); ``` やりたいことは「追加されたファイルのアイコン」を移動することなので、 上記コードの index を確定する必要があります。 そこで、次のような手順を考えました。 1. デスクトップフォルダを監視 2. ファイルが追加されたらそのファイル名を取得 3. LVM_GETITEM メッセージを投げてファイル名が一致する index を確保 4. LVM_SETITEMPOSITION でアイコンを移動 LVM_GETITEM メッセージを投げることで lParam に リストビューのアイテム情報が返ってきます。 ``` // vPointer にアイテムの情報が返ってくる SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)ptr); ``` ところがここで問題が。 デスクトップのリストビューに関して LVM_GETITEM メッセージで情報を取得するには WriteProcessMemory を使用する必要があります。 デバッグ実行時には問題ありませんが、 リリースして単体で実行すると、ウィルス対策ソフトによってその実行が妨げられ、 プロセスが抹殺されてしまいます。 さらに残念なことに、自分はウィルス対策ソフトの管理権限がないため、 こちらの設定を変更するなどの対処ができません。 WriteProcessMemory を使用せずに この機能を実現する方法はないでしょうか。
回答: デスクトップ上にプロジェクトファイルを置いて開発をしていたので、 そのサブディレクトリに含まれる Release フォルダから実行される 発行元不明のプロセスの不穏な挙動は ウイルス対策ソフトによって抹殺されるような設定になっていたようです。 Release ビルドしたアセンブリを C:\Program Files\ のサブディレクトリに入れてから実行すると 問題なく動作するようになりました。 ウイルス対策ソフトのセキュリティの甘さを垣間見た気がしますが、 とりあえず解決とします。 考えていてくれた方、ありがとうございました。