请问如何获取桌面listview的句柄

Ayalyc 2001-03-08 09:22:00
偶是一个vc的新手,正在拜读侯大师的"mfc深入浅出",应同学的要求,编一个小程序,主要是为了去除桌面上图标下文字的背景色,要知道在有墙纸时,那颜色挺烦人的.
偶根据查到的一点资料和msdn,知道要获取桌面listview的句柄.但是怎样获取这个handle呢?
偶已经写了一点了,如下:


HWND hWnd=GetDesktopWindow();
ListView_SetTextBkColor(hWnd,CLR_NONE);
int iCount=ListView_GetItemCount(hWnd);
ListView_RedrawItems(hWnd,0,(iCount-1));
UpdateWindow(hWnd);


偶知道要获取的是桌面listview的handle,而不是桌面的句柄,but how?
偶还不知道窗口刷新是什么东西,上面的东西是照msdn抄的,不知有没有错,请指正.
ps.偶在vc中debug,第二步hWnd的值就变成了0x00000080,偶不行了,help.
...全文
351 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
windoze 2001-03-13
  • 打赏
  • 举报
回复
用这个吧,我至今还没发现不能用的情况
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, stdcall

REFRESH_INTERVAL EQU 10000 ; in millisecons, 10 sec

ERROR_ALREADY_EXISTS EQU 183
LVM_GETTEXTBKCOLOR EQU 1025H
LVM_SETTEXTBKCOLOR EQU 1026H
IDLE_PRIORITY_CLASS EQU 40H
THREAD_PRIORITY_IDLE EQU -15

CreateMutexA PROTO NEAR32 stdcall,
lpMutexAttributes:NEAR32, bInitialOwner:DWORD, lpName:NEAR32

GetLastError PROTO NEAR32 stdcall

GetCurrentProcess PROTO NEAR32 stdcall

GetCurrentThread PROTO NEAR32 stdcall

SetPriorityClass 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:DWORD

ExitProcess PROTO NEAR32 stdcall,
dwExitCode:DWORD

.STACK 1024

.DATA

MutexName 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 dotransparent

exit:
INVOKE ExitProcess,
0 ; Result code for parent process

PUBLIC _start
END

hcphcp 2001-03-12
  • 打赏
  • 举报
回复
楼上好:

我回这个问题时, 用SPY++查过,好象它的句柄在两台机器不一样?
xyzboat 2001-03-12
  • 打赏
  • 举报
回复
先用spy++看桌面的List的参数,然后Findwindow(),你的参数可能不对
Ayalyc 2001-03-12
  • 打赏
  • 举报
回复
清关注
Ayalyc 2001-03-11
  • 打赏
  • 举报
回复
我将GetDesktopWindow()更换为FindWindowEx之后,在第二步就出错了,请问为什么
Ayalyc 2001-03-09
  • 打赏
  • 举报
回复
谢谢小四
hcphcp 2001-03-08
  • 打赏
  • 举报
回复
补充一下桌面的子窗口只有一个是属于SysListView32的,所以可以查出来
hcphcp 2001-03-08
  • 打赏
  • 举报
回复
这个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也可以,我没试,你试试吧


16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧