C#案頭表徵圖彈出提示

來源:互聯網
上載者:User

之前看見過某些軟體,安裝完畢後會在案頭表徵圖的旁邊彈出一個提示框.然後就嘗試著自己也實現一下這個效果.
先來看看最終效果:

 

 

實現方法

首先,必須知道表徵圖在螢幕上的位置.用SPY類工具探測了一下(這裡我用的是彗星小助手),
發現"案頭"是一個ListView控制項,既然是這個控制項,那就可以發送LVM_GETITEMTEXT訊息來擷取各個表徵圖的名稱,判斷哪個是我們要找的.
然後發送LVM_GETITEMRECT訊息擷取表徵圖的位置.
最後在表徵圖旁邊建立一個提示視窗,這裡我使用了UpdateLayeredWindow
需要注意的是:在64位作業系統上,LVM_GETITEMTEXT時那個LVITEM結構不太一樣.需要判斷一下作業系統是否64位的.

部分代碼 
  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. }  
完整代碼下載:

以下代碼在VS2005、Windows7x64環境測試通過.如果哪位測試不行請留言說明一下作業系統.
最早上傳的代碼判斷是否64位有問題,以下為修正後的代碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.