zoukankan      html  css  js  c++  java
  • C#桌面图标弹出提示

    之前看见过某些软件,安装完毕后会在桌面图标的旁边弹出一个提示框.然后就尝试着自己也实现一下这个效果.
    先来看看最终效果:

     

    实现方法

    首先,必须知道图标在屏幕上的位置.用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位有问题,以下为修正后的代码

  • 相关阅读:
    harbor1.9仓库同步迁移
    接口强制删除namespace 为Terminating的方法
    k8s 命令自动补全
    docker harbor 搭建&配置http/https 方法
    docker harbor 清理释放存储空间
    强化学习系列
    Kaggle的Outbrain点击预测比赛分析
    talkingdata比赛分析
    keras模型总结
    深度神经网络多任务学习(Multi-Task Learning in Deep Neural Networks)
  • 原文地址:https://www.cnblogs.com/longle/p/desktoptips.html
Copyright © 2011-2022 走看看