2 tingyuyiye01 tingyuyiye01 于 2016.04.25 14:09 提问

c++获取桌面图标名出错 1C

环境:win8.1 专业版
开发环境 vs2013-win32

通过测试,获取桌面句柄没有问题,获取图标坐标没有问题
但是获取文件快捷键名为空

//获取系统窗口句柄
HWND dwndparent;
HWND dwndviem = NULL;
HWND dwdesktopicon; 
dwndparent = FindWindowEx(0, 0, "WorkerW", "");//获得第一个WorkerW类的窗口
while ((!dwndviem) && dwndparent)
{
    dwndviem = FindWindowEx(dwndparent, 0, "SHELLDLL_DefView", 0);
    if (dwndviem != NULL)
        break;  
    dwndparent = FindWindowEx(0, dwndparent, "WorkerW", "");        
}
dwdesktopicon = FindWindowEx(dwndviem, 0, "SysListView32", "FolderView");
HWND listview = dwdesktopicon;
int count = (int)SendMessage(listview, LVM_GETITEMCOUNT, (WPARAM)0, (LPARAM)0);

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

GetWindowThreadProcessId(listview, &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);

//lvi.mask = LVIF_TEXT;
lvi.cchTextMax = 512;
lvi.pszText = _item;
lvi.iSubItem = 0;

RECT  rc;
rc.left = LVIR_ICON;
RECT* _rc = (RECT*)VirtualAllocEx(process, NULL, sizeof(RECT), MEM_COMMIT, PAGE_READWRITE);

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

    WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
    SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);

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

    ReadProcessMemory(process, _item, item, 512, NULL);
    ReadProcessMemory(process, _rc, &rc, sizeof(rc), NULL);
    cout << item;
    cout << endl;


}

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

ReadProcessMemory(process, _item, item, 512, NULL); //这里获取快捷键的名称出错

3个回答

tingyuyiye01
tingyuyiye01   2016.04.26 15:09

目前问题已经查出来了,经过验证,程序逻辑没有问题,出问题的地方是lvi.pszText = _item;这句,这里的赋值有问题
需要做的工作是重新定义一个LVITEM 结构体,将其中的的pszText的结构类型INT64 pszText;
typedef struct tagLVITEM64A
{
UINT mask;
int iItem;
int iSubItem;
UINT state;
UINT stateMask;
INT64 pszText;
int cchTextMax;
int iImage;
LPARAM lParam;
#if (_WIN32_IE >= 0x0300)
int iIndent;
#endif
#if (_WIN32_WINNT >= 0x501)
int iGroupId;
UINT cColumns; // tile view columns
PUINT puColumns;
#endif
} LVITEM64A, *LPLVITEM64A;


问题就这样解决了。

tingyuyiye01
tingyuyiye01   2016.04.26 15:10

目前问题已经查出来了,经过验证,程序逻辑没有问题,出问题的地方是lvi.pszText = _item;这句,这里的赋值有问题
需要做的工作是重新定义一个LVITEM 结构体,将其中的的pszText的结构类型INT64 pszText;
typedef struct tagLVITEM64A
{
UINT mask;
int iItem;
int iSubItem;
UINT state;
UINT stateMask;
INT64 pszText;
int cchTextMax;
int iImage;
LPARAM lParam;
#if (_WIN32_IE >= 0x0300)
int iIndent;
#endif
#if (_WIN32_WINNT >= 0x501)
int iGroupId;
UINT cColumns; // tile view columns
PUINT puColumns;
#endif
} LVITEM64A, *LPLVITEM64A;


问题就这样解决了。

tingyuyiye01
tingyuyiye01   2016.04.26 15:12

LVITEM64A lv;
lvi.cchTextMax = 512;
lvi.pszText = (INT64 )_item;
lvi.iSubItem = 0;
这样就完美解决了。
先在这里为自己鼓个掌,点个赞。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
修改桌面图标显示名称
有的时候客户可能有类似的需求,预置了一个APK ,没有源码,要求修改其桌面显示的名称。 有源码的话可以进行AndroidManifest.xml,下面列举没有源码的一种处理方法! 平台:80N 修改目录:packages/apps/Launcher3/src/com/android/launcher3/IconCache.java ///M: ALPS02586389.
桌面图标名的背景色变成了蓝色——解决方法
1、右键“我的电脑”--属性--高级--“性能”栏点击“设置”--视觉效果-勾选“在桌面上为图标标签使用阴影”,点击“应用”确定退出即可。 2、右键桌面--排列图标--在桌面上锁定WEB项目前的勾去掉 3、右击桌面空白处,依次单击“属性/桌面/自定义桌面/web”选项,将“网页”栏中的“当前主页”以及“http//......”等所有各项前面的勾全部去掉(“http//……”为从Interne
获取和设置磁盘驱动器卷标名称
获取和设置磁盘驱动器卷标名称 获取和设置磁盘驱动器卷标名称 获取和设置磁盘驱动器卷标名称
获取移动存储器的盘符及卷标信息
GetLogicalDriveStrings:获取盘符名称的信息,GetVolumeInformation:获取卷标等信息#include    #include    #include #include int   main(int   argc,   char   **argv)   {    std::string strdevicename; TCHAR szBuf[100]; mem
c# 获取桌面图标的位置和名称
在外国一个博客中看到的  转载过来  翻译了一下  并封装在一个类中   using System; namespace System.Windows.Forms { /// /// 获得桌面图标名称和位置 /// class GetIcoPointName { #region Api声明 private cons
获取桌面图标句柄
桌面图标是放在 SysListView32这个列表中 void C***::OnSetDeskIcon() {           HWND hwndParent = ::FindWindow( "Progman", "Program Manager" );           HWND hwndSHELLDLL_DefView = ::FindWindowEx( hwndP
去除桌面图标的下脚标
去除桌面图标的下脚标去除桌面图标的下脚标去除桌面图标的下脚标去除桌面图标的下脚标去除桌面图标的下脚标去除桌面图标的下脚标去除桌面图标的下脚标去除桌面图标的下脚标去除桌面图标的下脚标去除桌面图标的下脚标去除桌面图标的下脚标去除桌面图标的下脚标去除桌面图标的下脚标去除桌面图标的下脚标去除桌面图标的下脚标
存储过程 游标
显式游标的用法 声明游标 CURSOR 游标名 IS SELECT语句FROM语句; 打开游标 OPEN 游标名; 提取游标 FETCH 游标名 INTO 变量列表; 关闭游标 CLOSE 游标名; 完整示例
去掉桌面图标的小箭头
去掉桌面图标的小箭头,去掉桌面图标的小箭头,去掉桌面图标的小箭头
桌面图标显示蓝色问号解决方法
XP系统桌面的图标显示成蓝色圈圈里面白色问号,文档中有遇到问题的情况解决方法