
A 回答 (1件)
- 最新から表示
- 回答順に表示
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- デスクトップパソコン デスクトップのアイコンの位置が勝手に変わる 2 2022/12/18 21:45
- Windows 10 ネットからファイルをデスクトップにダウンロードする際、既存のファイルの並びが崩れてしまう 4 2022/04/19 08:20
- Windows 10 explorerをedgeで開く方法 2 2022/06/05 14:59
- Windows 10 アイコンの位置 1 2022/03/25 09:01
- iOS SSDのクローンについて 7 2022/11/04 10:41
- Excel(エクセル) デスクトップのエクセルで作成したファイルを開くと未記入のエクセルが開く 5 2022/08/17 15:55
- Windows 10 Windowsのアイコンの整列が変になりました 2 2022/06/24 00:02
- Windows 10 デスクトップにファイルを保存すると既存のファイルアイコンの列に割り込むように保存されて困ってます 2 2022/04/25 19:00
- Windows 7 ショートカットキー 応用編 どういうの主に使いますか? 2 2022/12/28 23:46
- Chrome(クローム) サイトのショートカットアイコンの格納場所は? 1 2022/12/26 01:38
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プロセスのアタッチ・デタッチ...
-
バックグラウンドのプロセスの...
-
Process.Startの戻り値を後で取得
-
vb.netでEXCEL起動がうまくでき...
-
指定した実行中プロセスの、指...
-
親子プロセス間でのデータの受...
-
C#でのbatファイル実行結果取得
-
SQLServerサービスマネージャの...
-
他のコンピュータのプロセスを取得
-
ADOでアクセスのレコードに...
-
ロードアベレージが高いのです...
-
別プロセスをの実行パスを取得...
-
子プロセスのデバッグ方法について
-
exeファイルを終了させない。
-
GPLによるソース公開の回避方法
-
プロセスIDに対応したファイル...
-
Linuxでのスレッド間メッセージ...
-
DLLにおいて、最後のプロセスデ...
-
explorer.exeが異様にメモリを食う
-
C++のプログラムをバックグラウ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
プロセスIDの取得方法について
-
ADOでアクセスのレコードに...
-
C#でのbatファイル実行結果取得
-
タスクマネージャーのプロセス...
-
VB6.0 SHELLで起動...
-
プロセスのアタッチ・デタッチ...
-
非表示になったエクセルは?
-
怪しいプロセス教えてください。
-
sleep関数の精度について
-
【C#】別プロセスがロックか...
-
Process.Startの戻り値を後で取得
-
IISがフリーズ
-
プロセスIDからウィンドウハ...
-
Linuxでのスレッド間メッセージ...
-
Windowsでのfork方法
-
SendMessageが失敗するときがある
-
警告『 別のプロセスで使用され...
-
WSH.Runで待機できません
-
VB.NETで起動したExcelの閉じ方...
おすすめ情報