IUIAutomation
IUIAutomationElement
GetCurrentPropertyValue
http://msdn.microsoft.com/en-us/library/ee671212(v=VS.85).aspx
取桌面图标位置. 2k, 98 方法不同.
// for NT based /
/* 取桌面 ListView 的句柄 */
HWND hDeskTop;
hDeskTop = FindWindow( "progman ", NULL);
hDeskTop = FindWindowEx(hDeskTop, 0, "shelldll_defview ", NULL);
hDeskTop = FindWindowEx(hDeskTop, 0, "syslistview32 ", NULL);
/* 取 explorer.exe 句柄. 注意 OpenProcess 的参数 */
DWORD dwProcessId;
GetWindowThreadProcessId(hDeskTop, &dwProcessId);
HANDLE hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_VM_OPERATION, FALSE, dw
ProcessId);
/* 在 explorer.exe 空间内分配内存 */
PVOID pv = VirtualAllocEx(hProcess, NULL, sizeof(POINT), MEM_COMMIT, PAGE_READW
RITE);
/* 给桌面 ListView 窗口发一 LVM_GETITEMPOSITION 取 "我的电脑 " 坐标 */
ListView_GetItemPosition(hDeskTop, 1, pv);
/* 把由 LVM_GETITEMPOSITION 获得的坐标数据复制到 pt 结构 */
POINT pt;
ReadProcessMemory(hProcess, pv, &pt, sizeof(POINT), NULL);
/* 释放内存, 句柄 */
VirtualFreeEx(hProcess, pv, 0, MEM_RELEASE);
CloseHandle(hProcess);
// for 9x /
/* 取桌面 ListView 的句柄 */
HWND hDeskTop;
hDeskTop = FindWindow( "progman ", NULL);
hDeskTop = FindWindowEx(hDeskTop, 0, "shelldll_defview ", NULL);
hDeskTop = FindWindowEx(hDeskTop, 0, "syslistview32 ", NULL);
/* 分配一共享内存 */
HANDLE hmm = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, s
izeof(POINT), NULL);
POINT * ppt;
ppt = (POINT *)MapViewOfFile(hmm, FILE_MAP_ALL_ACCESS, 0, 0, 0);
/* 给桌面 ListView 窗口发一 LVM_GETITEMPOSITION 取 "我的电脑 " 坐标 */
ListView_GetItemPosition( hDeskTop, 0, ppt);
/* 释放内存. 对 ppt 的操作要在这之前做. */
UnmapViewOfFile(ppt);
CloseHandle(hmm);
不同版本的 EXPLORER 中, "我的电脑 " 可能有不同的 index, 就是传给 ListView_GetItem
Position 的第 2 个参数. 2000 下是 1, 98 下似乎是 0.
网友对该文章的评论
网友: 匿名 发表于: 2003-9-27 18:22:52
you don 't need show off here
网友: sd 发表于: 2003-6-8 17:31:22
wwwwwwww
网友: 匿名 发表于: 2003-2-28 16:49:52
获取桌面图标位置. 2k, 98 方法不同.
// for NT based /
/* 取桌面 ListView 的句柄 */
HWND hDeskTop;
hDeskTop = FindWindow( "progman ", NULL);
hDeskTop = FindWindowEx(hDeskTop, 0, "shelldll_defview ", NULL);
hDeskTop = FindWindowEx(hDeskTop, 0, "syslistview32 ", NULL);
/* 取 explorer.exe 句柄. 注意 OpenProcess 的参数 */
DWORD dwProcessId;
GetWindowThreadProcessId(hDeskTop, &dwProcessId);
HANDLE hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_VM_OPERATION, FALSE, dw
ProcessId);
/* 在 explorer.exe 空间内分配内存 */
PVOID pv = VirtualAllocEx(hProcess, NULL, sizeof(POINT), MEM_COMMIT, PAGE_READW
RITE);
/* 给桌面 ListView 窗口发一 LVM_GETITEMPOSITION 取 "我的电脑 " 坐标 */
ListView_GetItemPosition(hDeskTop, 1, pv);
/* 把由 LVM_GETITEMPOSITION 获得的坐标数据复制到 pt 结构 */
POINT pt;
ReadProcessMemory(hProcess, pv, &pt, sizeof(POINT), NULL);
/* 释放内存, 句柄 */
VirtualFreeEx(hProcess, pv, 0, MEM_RELEASE);
CloseHandle(hProcess);
// for 9x /
/* 取桌面 ListView 的句柄 */
HWND hDeskTop;
hDeskTop = FindWindow( "progman ", NULL);
hDeskTop = FindWindowEx(hDeskTop, 0, "shelldll_defview ", NULL);
hDeskTop = FindWindowEx(hDeskTop, 0, "syslistview32 ", NULL);
/* 分配一共享内存 */
HANDLE hmm = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, s
izeof(POINT), NULL);
POINT * ppt;
ppt = (POINT *)MapViewOfFile(hmm, FILE_MAP_ALL_ACCESS, 0, 0, 0);
/* 给桌面 ListView 窗口发一 LVM_GETITEMPOSITION 取 "
网友: Wormie4evr(wormie4evr@peoplemail.com.cn) 发表于: 2003-2-13 20:58:52
barking:
不好意思,现在才看到。它们都是是桌面进程的窗口的类名,依次为父子窗口。
这些资料用Spy++软件获取很方便。
网友: daixi 发表于: 2003-1-27 11:31:29
ListView_GetItemPosition,可能是少了頭文件commctrl.h
网友: barking(barking_gentleman@hotmail.com) 发表于: 2003-1-26 9:48:53
ListView_GetItemPosition在编译时有错误提示是这个函数没被声明
应如何改?
网友: barking(barking_gentleman@hotmail.com) 发表于: 2003-1-20 8:44:58
能不能详细的说明一下 "progman ", "shelldll_defview ", "syslistview32 ", 各是什么意思?
在哪里能找到关于这些东西的资料
谢谢
----- Original Message -----
From: <li-jie_wang@agilent.com>
To: <superaide@163.com>
Sent: Friday, October 28, 2005 12:41 PM
Subject: hehe
Windows 高级编程指南
何编程实现,控制桌面图标是否自动排列,最好用API;
就是说我想控制 桌面点右键-> 排列图标-> 自动排列 这一项是否被选中
int GetSystemMetrics(
int nIndex // system metric or configuration setting
);
参数添SM_ARRANGE,得到是否自动排列
POINT Point;
int i,n;
hWnd=FindWindow( "Progman ", "Program Manager ");
hWnd=GetWindow(hWnd,GW_CHILD);
hWnd=GetWindow(hWnd,GW_CHILD);
n=ListView_GetItemCount(hWnd);
for(i=0;i <n;i++)
ListView_GetItemPosition(hWnd,i,&Point); //此步出错,因为是不同进程
我已经替你问了高人,但他说只在NT下才能用其它方法解决。呵呵,你去看看http://www.csdn.net/expert/topic/217/217263.shtm吧,我也没办法了,原来以为可以的,解决了记得告诉我一声。
能够指定任何一个桌面上的图标位置。??
将第一个项移到(500, 500)
HWND hPM = ::FindWindow(NULL, "Program Manager ");
HWND hShell = ::FindWindowEx(hPM, NULL, "SHELLDLL_DefView ", NULL);
HWND hSLV = ::FindWindowEx(hShell, NULL, "SysListView32 ", NULL);
ListView_SetItemPosition(hSLV, 0, 500, 500);
其它要用到的消息查下msdn,
LVM_GET打头
HWND hWndLv=GetFirstChild(GetFirstChild(FindWindow( "ProgMan ",NULL)))
hWndLv是左面ListView的句柄
然后用GetItemRect(hWndLv)得到每个图标的位置
SetItemRect()设置每个图标的位置
chi\
桌面是一个sysList32的通用控件