hook指定桌面图标

shoufaqi2 2013-10-28 03:28:30

#include <afx.h>
#include <windows.h>
#include <fstream>
#include <stdio.h>
#include <commctrl.h>
#include <tchar.h>
#include <iostream>
#include <string>
#pragma data_seg("MySec")
HHOOK g_hMouse=NULL;
//HWND g_hWnd=NULL;
HANDLE g_HInst = NULL;
#pragma data_seg()
#pragma comment(linker,"/section:MySec,RWS")
using namespace std;
RECT IcoRectArray[50];
int IconRectCount=0;
bool RefreshDesk()
{
//提权
HANDLE hToken;
HANDLE hProcess = GetCurrentProcess();
if ( OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) )
{
TOKEN_PRIVILEGES tkp;
if ( LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid) )
{
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0) ;
}
CloseHandle(hToken);
}

//定义变量
CString IcoNamesArrary[10];


//打开配置文件,获取其中的内容
fstream file;
file.open("G:\\word.txt");
string str;
file >> str;
file.close();
//cout << str;
//cout << endl;

//删除分隔符,将每条信息存入数组中

for (int i=0,j=0;i!=str.size();i++)
{

if (str[i]!='|')
{
IcoNamesArrary[j] += str[i];
}
else
{
j++;
}
}



//获取桌面图标信息
HWND listview = FindWindow(_T("progman"), NULL);
listview = FindWindowEx(listview, 0, _T("shelldll_defview"), NULL);
listview = FindWindowEx(listview, 0, _T("syslistview32"), NULL);

//int count=(int)SendMessage(listview, LVM_GETITEMCOUNT, 0, 0);

int count = ListView_GetItemCount(listview);
LVITEM lvi, *_lvi;
memset(&lvi, 0, sizeof(LVITEM));


WCHAR item[512];
WCHAR *_item;
unsigned long pid;
HANDLE process;

GetWindowThreadProcessId(listview, &pid);
process=OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);


_lvi=(LVITEM*)VirtualAllocEx(process, NULL, 100,
MEM_COMMIT, PAGE_READWRITE);
_item=(WCHAR *)VirtualAllocEx(process, NULL, 256, MEM_COMMIT,
PAGE_READWRITE);

RECT rc;
rc.left = LVIR_ICON; //这个一定要设定 可以去看MSDN关于LVM_GETITEMRECT的说明
RECT* _rc =(RECT*)VirtualAllocEx( process, NULL, sizeof(RECT), MEM_COMMIT, PAGE_READWRITE);

lvi.mask = LVIF_TEXT;
lvi.cchTextMax=200;
lvi.pszText=(LPWSTR)_item;
lvi.iSubItem=0;

for(int i=0; i<count; i++)
{
DWORD size = 0;
//bool writeres = WriteProcessMemory(process, _lvi, &lvi, sizeof(lvi), &size);
WriteProcessMemory(process, _lvi, &lvi, sizeof(lvi), &size);
int retlen =SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);
//bool readres = ReadProcessMemory(process, _item, item, 256, &size);
ReadProcessMemory(process, _item, item, 256, &size);

::WriteProcessMemory( process, _rc, &rc, sizeof(rc), NULL);
::SendMessage( listview, LVM_GETITEMRECT, (WPARAM)i, (LPARAM)_rc);
ReadProcessMemory(process, _rc, &rc, sizeof(rc), NULL);
WCHAR ItemText[1000]={0};
CString strItemText(ItemText);
strItemText.MakeLower();
for (int n = 0;n < 10; n++)
{
if(!IcoNamesArrary[n].IsEmpty() && strItemText==IcoNamesArrary[n])
{
IcoRectArray[IconRectCount].left = rc.left;
IcoRectArray[IconRectCount].top = rc.top;
IcoRectArray[IconRectCount].right = rc.right;
IcoRectArray[IconRectCount].bottom = rc.bottom;
IconRectCount++;

}
}

}

VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);
VirtualFreeEx(process, _item, 0, MEM_RELEASE);
VirtualFreeEx(process, _rc, 0, MEM_RELEASE);
CloseHandle( process );
return true;
}
//鼠标钩子
LRESULT CALLBACK MouseProc(
int nCode,
WPARAM wParam,
LPARAM lParam
)
{
//定义一个鼠标HOOK结构体
MSLLHOOKSTRUCT *m = (MSLLHOOKSTRUCT *)lParam;
POINT pt = m->pt;
for (IconRectCount;IconRectCount<10;IconRectCount++)
{
if (pt.x>=IcoRectArray[IconRectCount].left&&pt.x<=IcoRectArray[IconRectCount].right&&
pt.y>=IcoRectArray[IconRectCount].top&&pt.y<=IcoRectArray[IconRectCount].bottom)
{
return TRUE;
}
}
return CallNextHookEx(g_hMouse,nCode,wParam,lParam);
}

_declspec(dllexport) void SetHook()
{
RefreshDesk();
g_hMouse = SetWindowsHookEx(WH_MOUSE_LL,MouseProc,GetModuleHandle(_T("desk")),0);
//g_hWnd = hwnd;
}



大家给看看代码,弄了好几天了。
...全文
245 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2013-11-30
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
Eleven 2013-10-29
  • 打赏
  • 举报
回复
http://guzhou.me/%E5%A6%82%E4%BD%95%E6%93%8D%E4%BD%9C%E6%A1%8C%E9%9D%A2%E4%B8%8A%E7%9A%84%E5%9B%BE%E6%A0%87%EF%BC%8C%E5%B9%B6%E5%8F%96%E5%BE%97%E5%9B%BE%E6%A0%87%E7%9A%84%E4%BF%A1%E6%81%AF/ 看下这个,希望对你有所帮助~
wyx100 2013-10-28
  • 打赏
  • 举报
回复
桌面图标处理一般用shell 扩展或注入后子类化处理
shoufaqi2 2013-10-28
  • 打赏
  • 举报
回复
引用 1 楼 bdzwj 的回复:
没有你这么做的, 桌面图标处理一般用shell 扩展或注入后子类化处理
有具体的例子吗?
bdzwj 2013-10-28
  • 打赏
  • 举报
回复
没有你这么做的, 桌面图标处理一般用shell 扩展或注入后子类化处理

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧