用c++ 做到在桌面上悬浮某个图标时获取这个图标的位置信息

问题描述

用c++ 做到在桌面上悬浮某个图标时获取这个图标的位置信息

就像 windows这样,悬浮后会有一个tips出来里面是位置信息

解决方案

使用shell扩展可以实现
参考:
http://www.codeproject.com/Articles/448/The-Complete-Idiots-Guide-to-Writing-Shell-Exten

解决方案二:

至于根据快捷方式文件(.lnk)得到指向的文件和路径,参考:
http://www.codeguru.com/cpp/com-tech/shell/article.php/c1337/Getting-Shortcuts-lnk--Target-and-Arguments.htm

解决方案三:

http://blog.csdn.net/mycaibo/article/details/6002334

解决方案四:

我的目的是要遍历整个桌面的所有图标,获取每个图标的坐标,我在百度上搜了很多例子,也运行了,但是都不行,感觉最靠谱的就是这个

void Recurse(LPCTSTR pstr)
{

HWND hDestTop;
hDestTop = ::FindWindow("progman", NULL);
hDestTop = ::FindWindowEx(hDestTop, 0, "shelldll_defview", NULL);
hDestTop = ::FindWindowEx(hDestTop, 0, "syslistview32", NULL);

int count=(int)::SendMessage( hDestTop, LVM_GETITEMCOUNT, 0, 0);

LVITEM lvi, *_lvi;
char item[512], subitem[512];
char *_item, *_subitem;
unsigned long pid;
HANDLE process;

GetWindowThreadProcessId( hDestTop, &pid);
process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid);

_lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);
_item=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT, PAGE_READWRITE);
_subitem=(char*)VirtualAllocEx(process, NULL, 512, 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.cchTextMax=512;

for( int i=0; i< count; i++) {

    lvi.iSubItem=0;
    lvi.pszText=_item;
    WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
    ::SendMessage( hDestTop, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);

    lvi.iSubItem=1;
    lvi.pszText=_subitem;
    WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
    ::SendMessage( hDestTop, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);

    ::WriteProcessMemory( process, _rc, &rc, sizeof(rc), NULL);
    ::SendMessage( hDestTop, LVM_GETITEMRECT, (WPARAM)i, (LPARAM)_rc);

    ReadProcessMemory(process, _item, item, 512, NULL);
    ReadProcessMemory(process, _subitem, subitem, 512, NULL);

    ReadProcessMemory(process, _rc, &rc, sizeof(rc), NULL);
    CString str;
    str.Format("LF:%d TP:%d RT:%d BT:%d", rc.left,rc.top,rc.right,rc.bottom);
    AfxMessageBox(str);

    str.Format("%s - %sn", item, subitem);
    AfxMessageBox( str );
}

VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);
VirtualFreeEx(process, _item, 0, MEM_RELEASE);
VirtualFreeEx(process, _subitem, 0, MEM_RELEASE);
VirtualFreeEx(process, _rc, 0, MEM_RELEASE);

CloseHandle( process );

return ;

}

但是这个例子运行起来不起作用messagebox 打出来的结果是空的

跟踪查到
_lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);
_item=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT, PAGE_READWRITE);
_subitem=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT, PAGE_READWRITE);

这个地方获取出来的指针都是错误的指针,虽然有值但不起作用,不知道哪里出错了
时间: 2024-11-01 11:27:31

用c++ 做到在桌面上悬浮某个图标时获取这个图标的位置信息的相关文章

在桌面上执行刷新操作时为何很迟缓

  问:系统其他操作都很正常,唯独在桌面上"刷新"时就非常迟缓,请问这是为什么? 答:出现该现象很可能是因为桌面上放置了过多文件,或者放置了文件大小过大的文件造成的.很多朋友下载文件时喜欢直接保存到桌面上,因此这个问题很常见.此外,桌面上放置了过多的图标,使用文件大小过大的图片作为背景,也会造成刷新迟缓的现象.

求助,在做一个简单的图片上传下载应用时出错,看不懂出错信息

问题描述 HTTPStatus500---------------------------------------------------------------------------------typeExceptionreportmessagedescriptionTheserverencounteredaninternalerror()thatpreventeditfromfulfillingthisrequest.exceptionjavax.servlet.ServletExcept

Windows 8在桌面上总是显示大小写锁定和数字锁定图标

Windows 8 发布预览版 ThinkPad及部分Lenovo V480 V580 Lenovo B480 B580 昭阳K49 E49等商务机型 知识点分析: 取消屏幕上显示的 Caps Lock 以及 Num Lock 切换时的提示图标. 操作步骤: 没有 Caps Lock 和 Num Lock 指示灯的笔记本,切换时会在桌面上显示大小写锁定和数字锁定图标.如图: 解决方法: 1.在桌面空白处上点击鼠标右键,在弹出菜单中选择"屏幕分辨率".如下图所示: 2.在弹出窗口中,点击

Flash动画 让其巧妙的设置成桌面上的布景

flash动画 动画有很多种格式,Flash是比较优秀的一种.其文件小巧,并且可以任意放大,播放也很简单,下载一个插件后,用浏览器就可以播放.那我们能否让Flash文件做为桌面的布景呢?一般情况下,桌面上只能将图片文件做为背景,但同时它也支持Web格式的文件,也就是超文本文件.Flash是在网络上很流行的动画格式,在网络上展示它也就是通过超文本文件,那么我们只要在本地制作含有Flash动画的超文本文件,不就可以实现在桌面上显示Flash动画. 想法有了,现在要做的事情就是该如何实现. 一.获取F

教你在桌面上涂鸦

我曾经说过一句致理名言:涂鸦是人生一大乐趣. 只要你懂得涂鸦之道,涂鸦是非常好玩的 .在窗口上画多了,不爽了,想不想在桌面上画? 不要惊讶,这是可以的. Graphics类可以用 一个静态方法FromHwnd来创建实例,如果想在桌面上涂鸦,只要得到桌面的句柄就可以了.那么如何得 到桌面的句柄呢?要用到一个非托管API,即 [DllImport("User32.dll")] public extern static IntPtr GetDesktopWindow(); 使用它可以得到桌面

用Delphi隐藏桌面上的图标

使桌面上的图标消失,连桌面上的右键功能也不能使用如果不让初学者乱用"我的电脑"的话,那么把程序放到"启动"里,顺便把"Windows资源管理器"也去掉,再加上个多用户密码,那么想破坏电脑文件也无从下手了. varhDesktop : THandle;beginhDesktop := FindWindow('Progman', nil);ShowWindow(hDesktop, SW_HIDE);end; 该程序Delphi 4里通过.

在Windows8系统桌面上如何放置网页快捷

  操作步骤: 1.打开你要放置快捷图标的网站; 2.然后右键点击网网上空白的地方(不要点击图片,文字,连接等); 3.在弹出的右键菜单中,点击"创建快捷方式"; 4.然后弹出确认框后"确定",完成. 完成上面的操作后,你会发现桌面上出现了一个网页快捷方式,双击它就能直接访问该网站了

win8传统桌面上怎么放Windows UI

  win8传统桌面上怎么放Windows UI 该软件小巧便携,无需安装,运行后直接点击使用界面中的"Apply"按钮即可完成操作. 当用户再次使用鼠标指向屏幕左下角或者按下Windows徽标键后,即直接在Windows 8传统桌面显示Modern了.你也可以通过Start Menu Modifier自定义快捷键来呼出Modern应用.

Win7桌面上计算机图标怎么显示

  Win7桌面显示计算机图标的方法 看看初始状态或有这样问题的电脑桌面 点开始 --找搜索框 在搜索框里输入 "显示"就ok 找到第二行 "显示或隐藏桌面上的通用图标"双击打开 把这几个框打上" √" 然后点确定就ok了 看看效果吧 不错吧 学会了 windows 7各个版本都有效