• 締切済み

デスクトップ上のアイコン名の取得方法

デスクトップ上の座標を指定し、そこに配置してあるアイコン名(ファイル名) を返すようにする方法ってないですか? 但し、アイコンの配置はあらかじめ知らないとします。 つまり、座標を与えることでリアルタイムにデスクトップ上の 情報を得ることは可能でしょうか。 返してくれるのはアイコン名(ファイル名)だけで構いません。 環境はwindows vista又はXP、言語はc++(Eclipse+MinGW)です。

みんなの回答

回答No.1

 こんにちは。  デスクトップはアイコンスタイルのリストビューなので、マウス下のアイテム情報さえ取り出せれば、可能と言えば可能です。  但し、デスクトップは自プロセス外にある為、プロセス間共有メモリを割り当てて遣り取りしなければいけません。  とてもではありませんが、簡単に説明できる物ではありません。以下参考程度に。 #include<windows.h> #include<commctrl.h> #include<tchar.h> #include"resource.h" #pragma comment(lib, "comctl32.lib") typedef struct ProcessMemory { DWORD dwProcessID; DWORD dwThreadID; HANDLE hProcess; union { LPVOID pVoid; LPBYTE pByte; LPTSTR pTStr; LPARAM lParam; }; } PROCESSMEMORY, *LPPROCESSMEMORY; static BOOL OpenProcessMemory(LPPROCESSMEMORY p, HWND hWndOutProcess, DWORD dwSize) { p->dwThreadID = ::GetWindowThreadProcessId(hWndOutProcess, &p->dwProcessID); if(!p->dwThreadID || !p->dwProcessID) return FALSE; p->hProcess = ::OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, p->dwProcessID); if(!p->hProcess) return FALSE; p->pVoid = ::VirtualAllocEx(p->hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE); return p->pVoid != NULL; } static BOOL CloseProcessMemory(LPPROCESSMEMORY p) { if(!p->hProcess) return FALSE; ::VirtualFreeEx(p->hProcess, p->pVoid, 0, MEM_RELEASE); ::CloseHandle(p->hProcess); ::ZeroMemory(p, sizeof(PROCESSMEMORY)); return TRUE; } static DWORD WriteProcessMemory(LPPROCESSMEMORY p, DWORD dwByteOfOffset, const void* pIn, DWORD dwSizeOfIn) { DWORD dwLen = 0; ::WriteProcessMemory(p->hProcess, &p->pByte[dwByteOfOffset], pIn, dwSizeOfIn, &dwLen); return dwLen; } static DWORD ReadProcessMemory(const LPPROCESSMEMORY p, DWORD dwByteOfOffset, void* pOut, DWORD dwSizeOfOut) { DWORD dwLen = 0; ::ReadProcessMemory(p->hProcess, &p->pByte[dwByteOfOffset], pOut, dwSizeOfOut, &dwLen); return dwLen; } int WINAPI DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_INITDIALOG: ::SetTimer(hWnd, 1, 33, NULL); break; case WM_CLOSE: ::DestroyWindow(hWnd); ::KillTimer(hWnd, 1); break; case WM_NCDESTROY: ::PostQuitMessage(0); break; case WM_TIMER: { //マウス下のウィンドウを取り出す POINT pt; ::GetCursorPos(&pt); HWND hWndUnder = ::WindowFromPoint(pt); //此処に名前が入ってくる TCHAR buffer[MAX_PATH + 1]; //プロセス間共有メモリ(サイズは余裕をもって適当に割り当てる) ProcessMemory pm = {0}; ::OpenProcessMemory(&pm, hWndUnder, sizeof(LVHITTESTINFO) + sizeof(LVITEM) + sizeof(buffer)); //プロセス間共有メモリに必要なデータを書き込む LVHITTESTINFO lhif = {0}; lhif.pt = pt; ::WriteProcessMemory(&pm, 0, &lhif, sizeof(lhif)); //プロセス間共有メモリを使ってデスクトップに対してマウス下の状態を問い合わせる ListView_HitTest(hWndUnder, pm.pVoid); //プロセス間共有メモリに書かれた情報を、此方側に複写する ::ReadProcessMemory(&pm, 0, &lhif, sizeof(lhif)); //マウス下がアイコンだったら、 if(lhif.flags == LVHT_ONITEMICON) { //アイコンの情報を取り出すための準備 LVITEM item = {LVIF_TEXT}; item.iItem = lhif.iItem; item.iSubItem = lhif.iSubItem; //文字を受け取るバッファ オフセットはLVITEM構造体のサイズ item.pszText = &pm.pTStr[sizeof(item)]; item.cchTextMax = MAX_PATH; //プロセス間共有メモリに書く ::WriteProcessMemory(&pm, 0, &item, sizeof(item)); //プロセス間共有メモリを使ってデスクトップアイコンの状態を問い合わせる ListView_GetItem(hWndUnder, pm.pVoid); //プロセス間共有メモリに書かれた情報を、此方側に複写する ::ReadProcessMemory(&pm, 0, &item, sizeof(item)); //プロセス間共有メモリに書かれた情報を、此方側に複写する(LVITEM::pszTextの分) ::ReadProcessMemory(&pm, sizeof(item), buffer, sizeof(buffer)); //bufferにファイル名が入ってくる筈 } ::CloseProcessMemory(&pm); } break; } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) { MSG msg; HWND hDlg = ::CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, &::DlgProc); ::ShowWindow(hDlg, SW_SHOW); while(::GetMessage(&msg, NULL, 0, 0) == TRUE) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } return msg.wParam; }

関連するQ&A

  • デスクトップのアイコンを等間隔で並べたい

    XPだとデスクトップに新しいアイコンを作っても、別の場所に移動しても自動的に他のアイコンと等間隔で配置されます。 Meだと指定した場所に配置されて、並び方が他のアイコンとズレてしまいまい、見た目が整頓されていなく綺麗な感じがしません。 XPの様に、アイコンを等間隔で並べる方法はありませんか?

  • デスクトップのアイコンのファイル名が表示されません

    デスクトップのアイコンは表示しているのですが、ファイル名が表示されないので困っています。デスクトップを右クリックしてアイコンの整列で名前にはチェックは入っています。OSはXPのPro-SP3です。 エクスプロラーでは表示をアイコンにするとファイル名は表示されるので、デスクトップのみの不具合?かと思ってます。 他になにか設定があるのでしょうか・・・よろしくアドバイスのほどお願いいたします。

  • Windows Vistaのデスクトップのアイコン表示を

    Windows Vistaのデスクトップのアイコン表示を エクスプローラーのように表示を詳細で表示しないのですが... 可能でしょうか? それかファイル名をアイコンの横に表示することは可能でしょうか? 出来れば、Vista&XP両方教えていただければありがたいです。 よろしくお願いします。

  • デスクトップアイコンの設定について

    デスクトップアイコンのファイル名の部分が透明になってくれずに、ファイル名の背景がデスクトップのところで指定されているカラーになってしまっていて直せないでいます。 誰か直す方法の分かる方がいたら教えてください。 ちなみに、コントロールパネル-システム-詳細設定-デスクトップアイコンのファイル名に影をつける。 という方法は試してみました。 ほかにどこか変な設定をしてしまっているんでしょうか・・・ どうぞ宜しくお願いします。

  • デスクトップのアイコン表示がおかしくなりました。

    おかしい、というのは「F5キー」か右クリックの「最新の情報に更新」をしないとデスクトップ上のアイコンが更新しないということなんです。 DLしていて保存先をデスクトップに指定したのに、見つからないので気が付きました。デスクトップ上でファイルのコピーなどをしても同様の現象になります。 環境はXP-Proで、SP1です。デスクトップは壁紙を張った状態ですが、壁紙「なし」でもダメでした。 自分なりに色々と調べてやってみたのですが、もうお手上げです。やってみたことを書いてみます。 1)アイコンキャッシュが壊れたのかと思い、C:\Documents and Settings\アカウント名\Local Settings\Application Data内の「IconCache.db」を削除。通常の再起動・セーフモードでの再起動・ログオフ→ログインなどやってみましたが、再構築されずでした。XPの場合は再び作成されることはないのでしょうか? 2)「画面のプロパティ」→「デザイン」タブ→詳細設定で「指定する部分」をアイコンにして、サイズを1つ上げてOK→適用、再び同様にサイズを1つ下げてOKしてキャッシュのリフレッシュを試みましたが、これも効果なしでした。 もうこうなればレジストリをさわるしか方法はないのかと思ったりもしましたが、きっと他に良い方法をご存知の方がおられるのでは、と思った次第です。 どうぞ宜しくお願いいたします。

  • Vista:デスクトップ上のアイコンが左側によってしまいます

    Vista の HomeEdition を使用しています。 デスクトップにアイコンやファイルをおいています。 自分好みに配置しても、しばらくしてから、左側に固まって表示されてしまいます。この繰り返しです。 どうしてでしょうか? こうならないようにできますか? お知恵をお貸し下さい。

  • デスクトップのアイコンの並びについて

    これまでは特に気にしなかったのですが、なぜか気になってしまって。 デスクトップのアイコンは良く使うアイコンが通常に左に並んでいて 自分で作ったファイルで「印刷しないといけないもの」とか 「○日までに送ること!」などと付箋紙を利用して画面上に表示しています。 ところが、保存してすぐのファイルの場合、他のソフトを利用したあと デスクトップを見ると、左のアイコンの下に並んでいってしまいます。 自分でドラッグしてまた、右側に移動したりするのですが、その後も 何度か戻ってしまうことがあります。 どういう規則性があるのかわからないのですが、戻らないものもあるのです。 「アイコンの整列」のところには何もチェックが入っていないのですが 自分が配置したアイコンをずぅーっとそこに配置しておくには 何か他の作業が必要なのでしょうか? OSはXPで画面は「クラシック」にしています。

  • デスクトップアイコンの並び順について

    デスクトップアイコンの並び順について質問です。 以下の様な並べ方をしたいと思っています。 1.アイコン(フォルダ、ファイル等)の配置は、基本的に等間隔の配置 (普通に左上から下に向かって順に配置し、あふれたら右の列に移行する) 2.アイコンの並び順は、ドラッグ&ドロップで自由に決めたい (左上からまずゴミ箱、次にこのフォルダ・・・など) 3.ダウンロードしたファイルをデスクトップに保存すると、アイコンの最後尾に自動的に配置される (ダウンロードファイルは通常、デスクトップに保存されるようにしたいと考えています) デスクトップの右クリックメニューの「表示」から 「アイコンを等間隔に整列」にすれば、1と2は容易に達成できるのですが、 そのままだと3が達成できません。 ダウンロードしたファイルが、最後尾ではなく一番前(一番左上)になってしまいます。 右クリックメニューの「並べ替え」から 「更新日時」を選択することで、ダウンロードしたファイルが最後尾になるのですが、 そうすると2が達成できなくなってしまいます。 「更新日時」での並べ替えをしたあと、ドラッグ&ドロップの手動でアイコンを並べ替えることはできるのですが、 何かの拍子(プログラムのインストールや再起動等)で画面にリフレッシュがかかる(?)と、 手動で並べ直したアイコンが崩れてしまいます。 1、2、3を同時に達成する方法はないでしょうか? XPまでは何もいじらなくても、そのように出来ていたと思うのですが・・・ よろしくお願いします。

  • 使用していないデスクトップアイコン

    XPの時は、60日間使用していないデスクトップアイコンについては 使用していないアイコンがデスクトップにあります・・・みたいな表示があって、それを「使用していないアイコン」みたいなフォルダに整理できてたような記憶があるんですが、ビスタにはそのような機能はついていませんか? できればXPの時のように、使わないアイコンを一時整理のような形で保管し、なおかつデスクトップをスッキリさせたいのですが。 ビスタでどのようにやればいいか教えて下さい。お願いします。

  • デスクトップのアイコンを固定したい

    基本的な質問で恐縮です。 ●使いやすい配置に動かしたアイコンを、デスクトップの画面に固定するためには、どのようにすれば良いでしょうか。電源を切り再起動すると、元に戻ってしまいます。 デスクトップに、ショットカットで何個がアイコンをつくっています。 これらアイコンをマウスで動かし、使いたいグループごと画面上に配置しています。 ところが、次の日に電源をいれると、アイコンが動かす前の配置に戻ってしまいます。 OSはXPです。 以上 よろしくお願い致します。

専門家に質問してみよう