非hook获取桌面选中的图标

本文介绍了一种通过Windows API函数来获取桌面上所有图标及其选中状态的方法,并演示了如何读取这些图标的名称。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//获取系统桌面的句柄
HWND hWndLV = ::GetTopWindow(::GetTopWindow(::FindWindow("ProgMan", NULL)));
//保存桌面的进程ID
DWORD dwProcessId; 
GetWindowThreadProcessId(hWndLV, &dwProcessId);
//打开桌面进程
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
char item[512];
//在桌面进程申请可读写的内存
LVITEM *_lvi=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE); 
char *_item=(char*)VirtualAllocEx(hProcess, NULL, 512, MEM_COMMIT, PAGE_READWRITE); 
char *_subitem=(char*)VirtualAllocEx(hProcess, NULL, 512, MEM_COMMIT, PAGE_READWRITE);
LVITEM lvi; 
lvi.cchTextMax = 512;
lvi.iSubItem = 0;
lvi.pszText=_item; 
//保存选中的图标的名称
list<CString> m_lItemName;
//获取桌面图标的数量
int ItemCount = ListView_GetItemCount(hWndLV);
//遍历桌面图标
for(int i = 0; i <= ItemCount; i++)
{
//判断图标的是否为选中状态
if(LVIS_SELECTED == ListView_GetItemState(hWndLV, i, LVIS_SELECTED))
{
//往进程写入内存
WriteProcessMemory(hProcess, _lvi, &lvi, sizeof(LVITEM), NULL);
//获取桌面图标的名称
::SendMessage(hWndLV, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi); 
//读取桌面图标的名称
ReadProcessMemory(hProcess, _item, item, 512, NULL);m_lItemName.push_back(item);
}
}


 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值