桌面图标弹出提示

社区服务
高级搜索
猴岛论坛电脑百科桌面图标弹出提示
发帖 回复
倒序阅读 最近浏览的帖子最近浏览的版块
1个回复

桌面图标弹出提示

楼层直达
泪闯天涯.

ZxID:17182221

等级: 大尉
本人无QQ号、谢绝论坛短信

举报 只看楼主 使用道具 楼主   发表于: 2011-12-17 0
之前看见过某些软件,安装完毕后会在桌面图标的旁边弹出一个提示框.然后就尝试着自己也实现一下这个效果.
先来看看最终效果:





实现方法


首先,必须知道图标在屏幕上的位置.用SPY类工具探测了一下(这里我用的是彗星小助手),
发现"桌面"是一个ListView控件,既然是这个控件,那就可以发送LVM_GETITEMTEXT消息来获取各个图标的名称,判断哪个是我们要找的.
然后发送LVM_GETITEMRECT消息获取图标的位置.
最后在图标旁边创建一个提示窗口,这里我使用了UpdateLayeredWindow
需要注意的是:在64位操作系统上,LVM_GETITEMTEXT时那个LVITEM结构不太一样.需要判断一下操作系统是否64位的.


部分代码

<DIV bg_cpp?>

view plaincopy to clipboardprint?
  1. BOOL CIconToolTipDlg::GetIconRect(HWND hDeskWnd,CString strIconName,LPRECT lpRect)  
  2. {  
  3.     BOOL bRet=FALSE;  
  4.     //-----------------------------  
  5.     //遍历外部进程所有图标  
  6.     DWORD PID=0;  
  7.     GetWindowThreadProcessId(hDeskWnd,&PID);  
  8.     HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);  
  9.     if(!hProcess){  
  10.         TRACE(_T("获取进程句柄操作失败hWnd=%dPID=%d"),hDeskWnd,PID);  
  11.     }else{  
  12.         LVITEMA* pLVITEM=(LVITEMA*)VirtualAllocEx(hProcess,NULL,sizeof(LVITEM),MEM_COMMIT,PAGE_READWRITE);  
  13.         char* pszText=(char*)VirtualAllocEx(hProcess,NULL,512,MEM_COMMIT,PAGE_READWRITE);  
  14.         RECT* pItemRc=(RECT*)VirtualAllocEx(hProcess,NULL,sizeof(RECT),MEM_COMMIT,PAGE_READWRITE);  
  15.         RECT rc;  
  16.         if(!pItemRc || !pLVITEM){  
  17.             TRACE(_T("无法分配内存!"));  
  18.         }else{  
  19.             LVITEMA LVITEM;  
  20.             LVITEM.mask=LVIF_TEXT;  
  21.             LVITEM.cchTextMax=512;  
  22.             LVITEM.pszText=pszText;  
  23.             char ItemBuf[512];  
  24.             int nCount=::SendMessage(hDeskWnd,LVM_GETITEMCOUNT,0,0);  
  25.             for(int iItem=0;iItem<nCount;iItem++){  
  26.                 LVITEM.iItem=iItem;  
  27.                 LVITEM.iSubItem=0;  
  28.                 //将设置好的结构插入目标进程  
  29.                 WriteProcessMemory(hProcess,pLVITEM,&LVITEM,sizeof(LVITEM),NULL);  
  30.                 //发送LVM_GETITEM消息  
  31.                 BOOL r=(BOOL)::SendMessage(hDeskWnd,LVM_GETITEMTEXTA,iItem,(LPARAM)pLVITEM);  
  32.                 //获取pszText  
  33.                 ReadProcessMemory(hProcess,pszText,ItemBuf,512,NULL);  
  34.                 CString str=CString(ItemBuf);  
  35.                 //AfxMessageBox(str);  
  36.                 if(str==strIconName){                
  37.                     ::SendMessage (hDeskWnd,LVM_GETITEMRECT,iItem,(LPARAM)pItemRc);  
  38.                     ReadProcessMemory(hProcess,pItemRc,&rc,sizeof(RECT),NULL);  
  39.                     memcpy(lpRect,&rc,sizeof(RECT));  
  40.                     bRet=TRUE;  
  41.                     break;  
  42.                 }  
  43.   
  44.             }  
  45.             VirtualFreeEx(hProcess,pLVITEM,0,MEM_RELEASE);  
  46.             VirtualFreeEx(hProcess,pszText,0,MEM_RELEASE);  
  47.             VirtualFreeEx(hProcess,pItemRc,0,MEM_RELEASE);//释放内存  
  48.         }  
  49.         CloseHandle(hProcess);  
  50.     }  
  51.     //-----------------------------  
  52.     return bRet;  
  53. }  

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

本人无QQ号、谢绝论坛短信
小郭送Q

ZxID:16991378

等级: 上尉
免费送:情侣QQ号、连号QQ!www.songqqhao.com/?1020
举报 只看该作者 沙发   发表于: 2011-12-17 0
坐沙发
« 返回列表
发帖 回复
闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁绘劦鍓欓崝銈囩磽瀹ュ拑韬€殿喖顭烽弫鎰緞婵犲嫷鍚呴梻浣瑰缁诲倿骞夊☉銏犵缂備焦岣块崢杈ㄧ節閻㈤潧孝闁稿﹤缍婂畷鎴﹀Ψ閳哄倻鍘搁柣蹇曞仩椤曆勬叏閸屾壕鍋撳▓鍨灍闁瑰憡濞婇獮鍐ㄢ枎瀵版繂婀遍埀顒婄秵娴滄瑦绔熼弴銏♀拺闁告稑锕︾紓姘舵煕鎼淬倖鐝紒瀣槸椤撳吋寰勭€n剙骞愰柣搴$畭閸庤鲸顨ラ幖浣哄祦婵°倕鎳忛悡鐔兼煙閹呮憼缂佲偓閸愵喗鐓忛柛銉戝喚浼冨Δ鐘靛仜濞差厼鐣峰⿰鍕闁间粙鏀遍崹鍦閹惧瓨濯撮柟缁樺笂婢规洟姊绘笟鈧埀顒傚仜閼活垱鏅堕幍顔剧<閺夊牄鍔屽ù顕€鏌熼鐣屾噰妞ゃ垺顨婇崺鈧い鎺戝缁€澶愭煏閸繃顥犵紒鐘插⒔閻ヮ亪顢橀姀鈺傤棖缂備讲妾ч崑鎾绘煟鎼淬埄鍟忛柛鐘崇墵閳ワ箓鎮滈挊澶岀暫闂侀潧绻堥崐鏍磻閸岀偛绠归弶鍫濆⒔閹ジ鏌¢崱鏇炲祮婵﹦绮幏鍛存惞閻熸壆顐兼俊鐐€戦崝宀勫箠濮椻偓楠炲啳顦叉顏冨嵆瀹曟鎮欓鍌涘垱閻庤娲滈崰鏍€佸鈧幃鈺冨枈婢跺苯绨ラ梻鍌氬€峰ù鍥敋閺嶎厼鍨傞幖娣妼缁€鍐煥濠靛棙顥滈柣锕佷含缁辨捇宕掑顑藉亾妞嬪孩顐介柨鐔哄Т闂傤垱銇勯弴妤€浜鹃悗瑙勬礀缂嶅﹪鐛惔銊﹀癄濠㈣泛鐭堥崬褰掓⒒娓氣偓濞佳呮崲閹烘挻鍙忔い鎾跺€i敐澶婇唶闁靛濡囬崢顏堟椤愩垺澶勬繛鍙夌墪閺嗏晜淇婇悙顏勨偓鏍箰閹间礁绠规い鎰剁畱閻撴﹢鏌熸潏楣冩闁稿﹦鍏橀弻娑樷枎韫囷絾鈻撳┑鈽嗗亞閸嬬喓妲愰幘瀛樺闁惧繒鎳撶粭锟犳煟閵忊晛鐏℃い銊ョ墢閸掓帞鈧綆鍠栫粻鎶芥煙閹呭煟婵$虎鍣e娲川婵犲嫧妲堥柤鐟扮焸閺岀喖鏌ㄧ€n偁浠㈠┑顔硷攻濡炶棄鐣烽妸锔剧瘈闁告洦鍘鹃弳銈夋⒑鐠囨彃顒㈤柛鎴濈秺瀹曟粓鎮㈢粭琛″亾娓氣偓瀵噣宕煎顏傚姂閺屽秹宕崟顐熷亾婵犳艾鍌ㄩ梺顒€绉甸悡娆撴煠閸︻厼顣肩憸鎶婂懐纾奸柡灞诲劤閻h櫣鈧鍠楁繛濠囥€佸Δ浣虹懝闁搞儺鐓堥崯宥夋⒒娴h櫣甯涢柛鏃€鐗為妵鎰板礃椤斿吋杈堝┑鐐叉閸旀垶绂嶅⿰鍕╀簻闁规澘澧庨幃濂告煟椤撶喎娴柡灞剧洴閸╃偤骞嗚婢规洖鈹戦敍鍕杭闁稿﹥鐗滈弫顕€骞掗弬鍝勪壕婵ḿ鍘ф晶鎵磼椤旂⒈鐓肩€殿喕绮欐俊姝岊槾妞ゆ梹娲熷铏瑰寲閺囩偛鈷夐柦鍐憾閹ǹ绠涢敐鍛缂備浇椴哥敮锟犲箖椤忓嫧鏋庨煫鍥ㄦ煥椤︹晠姊虹紒妯诲鞍婵炲弶锕㈡俊鐢稿礋椤栵絾鏅i梺缁樻椤ユ挻绂掗幘顔解拺闁告繂瀚烽崕宥夋煕婵犲喚娈滄鐐差樀楠炴牗鎷呴悷棰佺綍闂備礁澹婇崑鍛崲閸曨剛顩烽柟缁㈠枟閳锋垿鎮楅崷顓烆€屾繛鍏煎姍閺屾盯濡搁妷锕€浠村Δ鐘靛仜閸燁偊鍩㈡惔銊ョ闁哄鍨堕缁樹繆閻愵亜鈧牜鏁繝鍥ㄥ€块柨鏇炲€哥粣妤呮煛瀹ュ骸浜炵痪鍙ョ矙閺屾稓浠﹂崜褎鍣柣鐘冲姃閸楁娊寮诲☉銏″亹鐎规洖娲ら埛鍫㈢磽娓氬洤鏋熸俊顐㈠暙閻i攱绺界粙鍨祮闂佺粯鍔栭鏍i幘顔解拻濞达絽鎲$拹锟犳煕鎼存稑鈧繈濡撮崘顔煎窛妞ゆ牗绮堢粭澶嬬節閻㈤潧校缁炬澘绉瑰畷鎴︽晲婢跺鍘遍梺闈涱樈閸犳洜鑺辨繝姘參闁告洦鍋侀崑銏ゆ煛瀹€鈧崰鏍箠閻愬搫唯闁挎梻铏庡Σ顒勬⒒娴e摜鏋冩い顐㈩樀瀹曞綊宕稿Δ鈧粻鏍ㄧ箾閸℃ɑ灏紒鐙欏洦鐓欓悗鐢登瑰皬闂佺懓顕崗妯侯潖缂佹ɑ濯撮柧蹇撶畭閳ь剙锕弻锟犲川椤斾勘鈧帡鏌嶈閸撴氨鍠婂鍜佺唵婵せ鍋撴い銏″哺閺佹劖寰勫Ο缁樻珖闂備焦瀵уú宥夊磻閹惧墎纾奸柍褜鍓熷畷姗€鍩炴径鍝ョ泿闂備礁鎼崯顐﹀磹閻熸壋鏋嶉柡鍥ュ灪閻撴洘绻涢崱妤冪妞ゃ儲绮撻弻宥囨喆閸曨偆浼岄梺璇″枓閺呮繄妲愰幒鎳崇喐绻濆顓熸婵犵數濮烽。钘壩i崨鏉戠;闁告稑鐡ㄩ崑锟犳煃閸濆嫬顏柨娑樺€垮缁樻媴閾忕懓绗$€光偓閿濆懏鍋ョ€规洘鍨挎俊鎼佹晜缂併垺閿ゆ繝鐢靛Т閿曘倝鎮ф繝鍥ㄥ亗闁靛鏅滈悡娑㈡煕鐏炲墽鈽夋い鏇熺矒閺岀喖顢涘鍗炩叺闂佸搫鏈惄顖氼嚕椤曗偓楠炴ḿ绱掑鍡忓亾瀹ュ鈷戦梺顐g〒閳规帡鏌涢弬璺ㄐら柟骞垮灩閳规垹鈧綆浜為ˇ銊╂⒑瀹曞洦鍤€闁靛洦锕㈤幖瑙勬償閵婏妇鍘介柟鍏肩暘閸娿倕岣块幇顓犵闁圭粯甯炵粻鑽も偓瑙勬礃缁诲倿顢樻總绋跨倞闁靛ǹ鍎辩花銉︾節閻㈤潧鈻堟繛浣冲浂鏁勯柛娑卞灣閻棝鏌涢幇闈涙灍闁绘挾鍠栭弻鐔稿鐎涙ɑ閿繝鈷€鍛笡濞e洤锕、鏇㈡晲閸モ晝鏉芥繝娈垮枛閿曘倝鈥﹀畡鎵殾闁圭儤鍨熼弸搴ㄦ煙閻戞ê鐏ラ悽顖e灦濮婄粯鎷呮笟顖涙暞濠电偛鎳忓ú鐔肩嵁閹达箑鐐婄憸蹇涘汲閿曞倹鐓熼柕蹇婃嚉瑜版帒绀冮柍褜鍓欓—鍐Χ閸℃ê鏆楅梺绋款儑閸犳牠銆佸▎鎾冲耿婵炴垶鐟㈤幏娲煟閻樺厖鑸柛鏂胯嫰閳诲秹骞囬悧鍫㈠幍闂佸憡鍨崐鏍偓姘炬嫹