这个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也可以,我没试,你试试吧
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也可以,我没试,你试试吧
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