-
关注Ta
-
- 注册时间 2011-12-10
- 最后登录 2019-08-01
-
- 发帖371
- 在线63小时
- 精华0
- DB3912
- 威望5
- 保证金0
- 桃子0
- 鲜花0
- 鸡蛋0
-
访问TA的空间加好友用道具
|
之前看见过某些软件,安装完毕后会在桌面图标的旁边弹出一个提示框.然后就尝试着自己也实现一下这个效果. 先来看看最终效果: 实现方法 首先,必须知道图标在屏幕上的位置.用SPY类工具探测了一下(这里我用的是 彗星小助手), 发现"桌面"是一个ListView控件,既然是这个控件,那就可以发送LVM_GETITEMTEXT消息来获取各个图标的名称,判断哪个是我们要找的. 然后发送LVM_GETITEMRECT消息获取图标的位置. 最后在图标旁边创建一个提示窗口,这里我使用了UpdateLayeredWindow 需要注意的是:在64位操作系统上,LVM_GETITEMTEXT时那个LVITEM结构不太一样.需要判断一下操作系统是否64位的. 部分代码 <DIV bg_cpp?> view plaincopy to clipboardprint?- BOOL CIconToolTipDlg::GetIconRect(HWND hDeskWnd,CString strIconName,LPRECT lpRect)
- {
- BOOL bRet=FALSE;
- //-----------------------------
- //遍历外部进程所有图标
- DWORD PID=0;
- GetWindowThreadProcessId(hDeskWnd,&PID);
- HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
- if(!hProcess){
- TRACE(_T("获取进程句柄操作失败hWnd=%dPID=%d"),hDeskWnd,PID);
- }else{
- LVITEMA* pLVITEM=(LVITEMA*)VirtualAllocEx(hProcess,NULL,sizeof(LVITEM),MEM_COMMIT,PAGE_READWRITE);
- char* pszText=(char*)VirtualAllocEx(hProcess,NULL,512,MEM_COMMIT,PAGE_READWRITE);
- RECT* pItemRc=(RECT*)VirtualAllocEx(hProcess,NULL,sizeof(RECT),MEM_COMMIT,PAGE_READWRITE);
- RECT rc;
- if(!pItemRc || !pLVITEM){
- TRACE(_T("无法分配内存!"));
- }else{
- LVITEMA LVITEM;
- LVITEM.mask=LVIF_TEXT;
- LVITEM.cchTextMax=512;
- LVITEM.pszText=pszText;
- char ItemBuf[512];
- int nCount=::SendMessage(hDeskWnd,LVM_GETITEMCOUNT,0,0);
- for(int iItem=0;iItem<nCount;iItem++){
- LVITEM.iItem=iItem;
- LVITEM.iSubItem=0;
- //将设置好的结构插入目标进程
- WriteProcessMemory(hProcess,pLVITEM,&LVITEM,sizeof(LVITEM),NULL);
- //发送LVM_GETITEM消息
- BOOL r=(BOOL)::SendMessage(hDeskWnd,LVM_GETITEMTEXTA,iItem,(LPARAM)pLVITEM);
- //获取pszText
- ReadProcessMemory(hProcess,pszText,ItemBuf,512,NULL);
- CString str=CString(ItemBuf);
- //AfxMessageBox(str);
- if(str==strIconName){
- ::SendMessage (hDeskWnd,LVM_GETITEMRECT,iItem,(LPARAM)pItemRc);
- ReadProcessMemory(hProcess,pItemRc,&rc,sizeof(RECT),NULL);
- memcpy(lpRect,&rc,sizeof(RECT));
- bRet=TRUE;
- break;
- }
-
- }
- VirtualFreeEx(hProcess,pLVITEM,0,MEM_RELEASE);
- VirtualFreeEx(hProcess,pszText,0,MEM_RELEASE);
- VirtualFreeEx(hProcess,pItemRc,0,MEM_RELEASE);//释放内存
- }
- CloseHandle(hProcess);
- }
- //-----------------------------
- return bRet;
- }
BOOL CIconToolTipDlg::GetIconRect(HWND hDeskWnd,CString strIconName,LPRECT lpRect){BOOL bRet=FALSE;//-----------------------------//遍历外部进程所有图标DWORD PID=0;GetWindowThreadProcessId(hDeskWnd,&PID);HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);if(!hProcess){TRACE(_T("获取进程句柄操作失败hWnd=%dPID=%d"),hDeskWnd,PID);}else{LVITEMA* pLVITEM=(LVITEMA*)VirtualAllocEx(hProcess,NULL,sizeof(LVITEM),MEM_COMMIT,PAGE_READWRITE);char* pszText=(char*)VirtualAllocEx(hProcess,NULL,512,MEM_COMMIT,PAGE_READWRITE);RECT* pItemRc=(RECT*)VirtualAllocEx(hProcess,NULL,sizeof(RECT),MEM_COMMIT,PAGE_READWRITE);RECT rc;if(!pItemRc || !pLVITEM){TRACE(_T("无法分配内存!"));}else{LVITEMA LVITEM;LVITEM.mask=LVIF_TEXT;LVITEM.cchTextMax=512;LVITEM.pszText=pszText;char ItemBuf[512];int nCount=::SendMessage(hDeskWnd,LVM_GETITEMCOUNT,0,0);for(int iItem=0;iItem<nCount;iItem++){LVITEM.iItem=iItem;LVITEM.iSubItem=0;//将设置好的结构插入目标进程WriteProcessMemory(hProcess,pLVITEM,&LVITEM,sizeof(LVITEM),NULL);//发送LVM_GETITEM消息BOOL r=(BOOL)::SendMessage(hDeskWnd,LVM_GETITEMTEXTA,iItem,(LPARAM)pLVITEM);//获取pszTextReadProcessMemory(hProcess,pszText,ItemBuf,512,NULL);CString str=CString(ItemBuf);//AfxMessageBox(str);if(str==strIconName){::SendMessage (hDeskWnd,LVM_GETITEMRECT,iItem,(LPARAM)pItemRc);ReadProcessMemory(hProcess,pItemRc,&rc,sizeof(RECT),NULL);memcpy(lpRect,&rc,sizeof(RECT));bRet=TRUE;break;}}VirtualFreeEx(hProcess,pLVITEM,0,MEM_RELEASE);VirtualFreeEx(hProcess,pszText,0,MEM_RELEASE);VirtualFreeEx(hProcess,pItemRc,0,MEM_RELEASE);//释放内存}CloseHandle(hProcess);}//-----------------------------return bRet;} 完整代码下载: 以下代码在VS2005、Windows7 x64、WindowsXP x86环境测试通过.如果哪位测试不行请留言说明一下操作系统. 下载地址1: http://download.csdn.net/detail/cometnet/3794378下载地址2: http://www.codefans.net/soft/15697.shtml下载地址3: http://www.2cto.com/kf/201111/111183.html
|