我想得到桌面的句柄,有一个API  GetDesktopWindow(),但好像并不正确!function TForm1.GetDesktopHand: THandle;
begin
  {Result:=FindWindow('progman',nil);
  Result:=GetWindow(Result,GW_Child);
  Result:=GetWindow(Result,GW_Child);}  Result := GetDesktopWindow;
  Result := FindWindowEx(Result, 0, 'Progman', nil);
  Result := FindWindowEx(Result, 0, 'SHELLDLL_DefView', nil);
  Result := FindWindowEx(Result, 0, 'SysListView32', nil);
end;请问'Progman' and 'SHELLDLL_DefView' and 'SysListView32' 是什么意思??
我是想用SendMessage(Hand, LVM_GETITEMPOSITION, 0, Longint(@ppt));来得到桌面ICO的位置!!请问如何得到正确的桌面句柄(Hand)???
 

解决方案 »

  1.   

    你看到有圖標的桌面, 其實它的class 就是 SysListView32一層層找下去, 就找到了
      

  2.   

    这些都是系统窗口的类名,你可以用spy等一些工具查看到的
      

  3.   

    用Spy查得的结果是桌面区域的class(类名)为SysListView32,SysListView32父窗口class为Progman;控制桌面图标隐显用Progman的句柄就可以,你的用法我不会,呵呵;GetDesktopWindow()得的结果和上面的都不一样,不过有次我也时也有效果,那次好象是列举桌面上的所有窗口,看一些资料好象其比Progman级别还要高;我求得handle为
    65546  -> GetDesktopWindow
    393260 -> FindWindow('Progman', nil);
    327722、393262分别是其下句柄,倒和Spy得到的结果一致;还有个GetDC(0),不知道有什么用,好象是屏幕可绘区域的句柄,帮你up
      

  4.   

    谢谢!!
    ///////////////// 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);这是VC的代码!!我不明白为什么用ListView_GetItemPosition(hDeskTop, 1, pv);这个函数为什么要做这么多工作,为什么呢??不理解?请大家家研究研究!!!!