这个hWnd是桌面的句柄,不是桌面内部的ListView子窗体的句柄,有下面这个API
FindWindowEx(HWND hWndParent,HWND hWndChildAfter,LPCTSTR lpszClass,LPCTSTR lpszWindow)
这样调用FindWindowEx(NULL,NULL,"SysListView32",NULL)就可以得到那个ListView的句柄
这几天我的VC坏了没试,,你试试
第一个参数传给NULL代表“桌面”因为winuser.h中定义了
#define HWND_DESKTOP        ((HWND)0)
第二个传给NULL代表查找所有的子窗口,
当然用EnumChildWindow也可以,我没试,你试试吧

解决方案 »

  1.   

    补充一下桌面的子窗口只有一个是属于SysListView32的,所以可以查出来
      

  2.   

    我将GetDesktopWindow()更换为FindWindowEx之后,在第二步就出错了,请问为什么
      

  3.   

    先用spy++看桌面的List的参数,然后Findwindow(),你的参数可能不对
      

  4.   

    楼上好:我回这个问题时, 用SPY++查过,好象它的句柄在两台机器不一样?
      

  5.   

    用这个吧,我至今还没发现不能用的情况
    HWND hDesktop=FindWindow("Progman", "Program Manager");
    if(!hDesktop)
    return 0;
    HWND hSub=GetDlgItem(hDesktop, 0L);
    if(!hSub)
    return 0;
    hSub=GetDlgItem(hSub, 1L);
             // 此时hSub就是桌面ListView的句柄要注意的是你那段程序在桌面设成Web方式的时候不管用。
    最后顺便给你个程序,可以定时把文字背景搞成透明的(你的程序不就是干这个的吗),用MASM编译后长度为2.5K
    编译命令:
    ml /c /coff transp.asm
    link -subsystem:windows -entry:_start -out:transp.exe transp.obj kernel32.lib user32.lib源程序:.386
    .MODEL flat, stdcallREFRESH_INTERVAL     EQU 10000 ; in millisecons, 10 secERROR_ALREADY_EXISTS EQU 183
    LVM_GETTEXTBKCOLOR   EQU 1025H
    LVM_SETTEXTBKCOLOR   EQU 1026H
    IDLE_PRIORITY_CLASS  EQU 40H
    THREAD_PRIORITY_IDLE EQU -15CreateMutexA PROTO NEAR32 stdcall,
    lpMutexAttributes:NEAR32, bInitialOwner:DWORD, lpName:NEAR32

    GetLastError PROTO NEAR32 stdcall

    GetCurrentProcess PROTO NEAR32 stdcallGetCurrentThread PROTO NEAR32 stdcallSetPriorityClass PROTO NEAR32 stdcall,
    hProcess:DWORD, dwPriorityClass:DWORD

    SetThreadPriority PROTO NEAR32 stdcall,
    hProcess:DWORD, dwPriorityClass:DWORD

    Sleep PROTO NEAR32 stdcall,
    dwMilliseconds:DWORD

    FindWindowA PROTO NEAR32 stdcall,
    lpClassName:NEAR32, lpWindowName:NEAR32

    GetDlgItem PROTO NEAR32 stdcall,
    hDlg:DWORD, nCtlID:DWORD

    SendMessageA PROTO NEAR32 stdcall,
    hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD

    InvalidateRect PROTO NEAR32 stdcall,
    hWnd:DWORD, lpRect:NEAR32, bErase:DWORDExitProcess PROTO NEAR32 stdcall,
        dwExitCode:DWORD.STACK 1024.DATAMutexName     DB "TransparentEx", 0
    ProgManClass  DB "Progman", 0
    ProgManWnd    DB "Program Manager", 0
    hDesktop      DD 0.CODE
    _start:
    ; Create a named mutex to test if there is a previous instance exists
    INVOKE CreateMutexA,
    0,
    1,
    NEAR32 PTR MutexName
    INVOKE GetLastError
    cmp eax, ERROR_ALREADY_EXISTS      ; Mutext already created
    je  exit ; Set process and thread priority
    INVOKE GetCurrentProcess
    INVOKE SetPriorityClass,
    eax,
    IDLE_PRIORITY_CLASS
    INVOKE GetCurrentThread
    INVOKE SetThreadPriority,
    eax,
    THREAD_PRIORITY_IDLE

    dotransparent:
    ; Find desktop window
    INVOKE FindWindowA,
    NEAR32 PTR ProgManClass,
    NEAR32 PTR ProgManWnd
    jz  exit
    INVOKE GetDlgItem,
    eax,
    0
    jz  exit
    INVOKE GetDlgItem,
    eax,
    1
    jz  exit
    mov hDesktop, eax ; Test if icon text is already transparent
    INVOKE SendMessageA,
    eax,
    LVM_GETTEXTBKCOLOR,
    0,
    0FFFFFFFFH
    and eax, 0FF000000H
    jnz sleepnow

    ; If not, set transparent text
    INVOKE SendMessageA,
    hDesktop,
    LVM_SETTEXTBKCOLOR,
    0,
    0FFFFFFFFH

    ; Refresh desktop window
    INVOKE InvalidateRect,
    hDesktop,
    0,
    1

    sleepnow:
    ; Wait a while(10 sec)
    INVOKE Sleep,
    REFRESH_INTERVAL ; Repeat
    jmp dotransparentexit:
        INVOKE  ExitProcess,
            0                      ; Result code for parent processPUBLIC _start
    END