不见高手不回头:顶层窗口、桌面窗口、桌面的子窗口、任务条窗口、Progman(跟贴有分)

时间:2022-09-02 15:09:20
我很菜,很多概念在书中也找不到,可是不搞明白又睡不着觉,所以斗胆向您讨教:

1.我的理解:应用程序的窗口应该和桌面窗口是同一层的(例如用刷子刷新桌面时,事实上就是把桌面窗口调到前面来)。
所以说“所有的应用程序的窗口是桌面窗口的子窗口”就没法理解,而且任务条窗口与桌面窗口的关系呢?

2.Progman是否就是shell(explorer.exe),progman与desktop及taskbar的关系

3.在spy++中,所有的窗口都在0001000C""#32769[Desktop]下边(包括Progman),这里的Desktop又与Progman之间是什么牵连呢

4.FindWindowEx(FindWindow("Progman", vbNullString), 0, "shelldll_defview", vbNullString)应该等于getdesktopwindow()(事实上不等)


请多多发言!谢谢

54 个解决方案

#1


跟贴

#2


安装盘里面有个Spy.exe运行后好好看看,也许有帮助.

#3


虽然我不知道,但是你写了“跟贴有分”,只有过来凑凑热闹。

#4


关注

#5


u p

#6


我也对这些问题感兴趣,请高手踊跃发言呀。

#7


高手发言

#8


#9


对不起,尽管我很想回答你的问题,但我要离开这里了,看看
http://www.csdn.net/Expert/topic/490/490851.shtm
就知道为什么了。
如果要找我,请到
http://www.d1vb.com

#10


请您发言,哪怕一点提示或资料、连接,只要能释疑、解惑都行

(多谢大家的关注,分不够的话我会加的)

#11


我还有另外两个问题,您也许能解决:
http://www.csdn.net/Expert/topic/484/484745.shtm
http://www.csdn.net/expert/TopicView.asp?id=484448

对http://www.csdn.net/expert/TopicView.asp?id=484448这个贴子能给一个"创建一个象输入法一样的窗口(得不到焦点,不能active)"的样例,我就结贴。我会继续等的。

谢谢

#12


怎么没人回答呀

#13


跟贴 
我不太清楚,你说跟贴着有分我才跟的。

#14


多谢关注!
up

#15


关注

#16


这段时间怎么没见板主呀,我需要有人解决问题的高手,不然的话CSDN就不行了!

#17


这需要明白windows系统:
Explorer 提供了用户接口,当然,桌面并不基于Explorer 如果没有Explorer 则桌面上空的。

1.我的理解:应用程序的窗口应该和桌面窗口是同一层的(例如用刷子刷新桌面时,事实上就是把桌面窗口调到前面来)。——这是由GDI对屏幕所作的假象
所以说“所有的应用程序的窗口是桌面窗口的子窗口”就没法理解,而且任务条窗口与桌面窗口的关系呢?——如果不启动 Explorer 而启动另一程序仍可运行。所以这个关系是相对的。

2.Progman是否就是shell(explorer.exe),progman与desktop及taskbar的关系
desktop及taskbar是explorer.exe程序的一部分


3.在spy++中,所有的窗口都在0001000C""#32769[Desktop]下边(包括Progman),这里的Desktop又与Progman之间是什么牵连呢
实际是独立的

4.FindWindowEx(FindWindow("Progman", vbNullString), 0, "shelldll_defview", vbNullString)应该等于getdesktopwindow()(事实上不等)
确实不是同一窗口。因为是两个EXE

看来我还有些不太明白。仅供参考!

#18


我也关注

#19


巴顿先生作了简要的提示,但是desktop explorer及progman间的关系仍然是含糊和矛盾的

是不是VB版的朋友对windows系统的组成及机制不甚了解呀。再等一天,不行的话,改贴到VC版,哎!

#20


跟贴

#21


我也学习一下.:)

#22


今天我打开尘封已久的《Programming in windows3.1》(Microsoft Press),虽然太老,与现在相比经典的东西还不算过时,但1000多页看到何时。哪位介绍一下有关windows机制或经典API的书,以有利于解决这类的问题!

等待您的指导

#23


这两个贴子也是我的
http://www.csdn.net/Expert/topic/484/484745.shtm
http://www.csdn.net/expert/TopicView.asp?id=484448
在后面跟贴也有分的!(我还有几千分,我愿用所有的分换取您的答复)


(CSDN在我的工作中很重要,为什么这次让我如此疲惫,你不能让我失望呀!!!)

#24


改贴到VC++吧!

#25


输入法窗口,实际是两种窗口:
输入法状态栏是Region, 是由Rgn相关函当选操作出来的。
输入法的文字显示窗口则是windows 窗口类中的IME

以下代码演示用VB创建IME窗口

module:

Option Explicit

Public Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type



Form1:

Option Explicit

Private Declare Function CreateWindowEx Lib "user32" _
    Alias "CreateWindowExA" (ByVal dwExStyle As Long, _
                             ByVal lpClassName As String, _
                             ByVal lpWindowName As String, _
                             ByVal dwStyle As Long, _
                             ByVal x As Long, _
                             ByVal y As Long, _
                             ByVal nWidth As Long, _
                             ByVal nHeight As Long, _
                             ByVal hWndParent As Long, _
                             ByVal hMenu As Long, _
                             ByVal hInstance As Long, _
                             lpParam As Any) As Long
                             

Private Const WM_CREATE = &H1

Private Const WS_EX_TOPMOST = &H8&

Private Const WS_EX_LEFT = &H0

Private Const WS_EX_LTRREADING = &H0
Private Const WS_EX_RIGHTSCOLLBAR = &H0

Private Const WS_BORDER = &H800000

Private Const WS_POPUP = &H80000000


Private Const WS_DISABLED = &H8000000
Private Const WS_CLIPSIBLINGS = &H4000000
Private Const WS_OVERLAPPED = &H0&


Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Private Const SW_NORMAL = 1
Private Const SW_PARENTOPENING = 3
Private Const SW_SHOW = 5

Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long



Private Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long

Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long

Private Declare Function FrameRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal HBRUSH As Long) As Long

Private Declare Function FillRgn Lib "gdi32" (ByVal hdc As Long, ByVal HRGN As Long, ByVal HBRUSH As Long) As Long

Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long


Dim HwndNew As Long

Private Sub Form_Load()
    
    Dim LREC As RECT
    
    Dim Hrect As Long
    
    Dim Hwdc As Long
    
    Dim WCOLOR As Long
    
    Dim HBRUSH As Long
    
    Dim HRGN As Long
        
    HwndNew = CreateWindowEx(WS_EX_TOPMOST, "IME", "New", WS_POPUP Or WS_DISABLED Or WS_CLIPSIBLINGS Or WS_OVERLAPPED, _
                0, 0, 200, 200, Me.hwnd, 0, 0, WM_CREATE)
                Debug.Print HwndNew
    
    ShowWindow HwndNew, SW_NORMAL
                 
    Hrect = GetClientRect(HwndNew, LREC)
    
    Hwdc = GetDC(HwndNew)
    
    WCOLOR = RGB(255, 255, 255)
    
    HRGN = CreateRectRgn(LREC.Left, LREC.Top, LREC.Right, LREC.Bottom)
    
    HBRUSH = CreateSolidBrush(WCOLOR)
    
    FillRgn Hwdc, HRGN, HBRUSH
    
End Sub

Private Sub Form_Unload(Cancel As Integer)
    DestroyWindow HwndNew
End Sub


 

#26


看来只有改到vc++中了

#27


VC的朋友 ,帮帮忙呀!

#28


芬纷纷!

#29


help me

#30


desktop窗口是最基本的窗口,当win32环境子系统运行后就有了,不依赖explorer.exe

progman是explorer.exe这个shell运行后才有的,隶属于exporer.exe.
taskbar 也一样属于explorer.exe进程

我个人的猜测:在spy++里desktop下的一层窗口就是top-level window,文档上说没有父窗口的窗口就是top-level窗口,我想也许更接近事实的说法是父窗口是desktop的窗口就是
top-level 窗口

#31


涨见识了  :)

#32


学到东西了!·!!

#33


我要分

#34


多谢Ferchis(神物自晦):

Desktop是否可以理解为整个屏幕(screen)(如GetDC(0)得到的是screen的HDC)

那么存放图标的那个"桌面"就不应该是以上所说的Desktop,它应是explorer.exe的一部分
否则FindWindowEx(FindWindow("Progman", vbNullString), 0, "shelldll_defview", vbNullString)应该等于getdesktopwindow()(事实上不等)


#35


Desktop这个窗口不能理解为整个屏幕,它覆盖了整个屏幕
GetDC(0)得到的是整个屏幕的DC

HDC hDC = ::GetDC(::GetDesktopWindow()); // method 1
//HDC hDC = ::GetDC(0); // method 2
::TextOut(hDC,100,100,"333",3);

用一个程序试一下上面的代码的两种情况,你会发现 method1什么也画不出来
method2 可以在(100,100)那个地方任意画.

#36


大家探讨一下,我也说说我的观点,也许不成熟,仅供参考。
Win32系统提供了图形界面的底层操作和管理,而Explorer仅仅用这些方法实现了图形界面,实际上完全可以用另外的shell程序来实现(这点可以看看system.ini中的shell=Explorer.exe),从这点意义上说,Explorer.exe和其他Win32应用程序并没有本质上的不同,只不过Explorer.exe实现了很多特殊的功能而已(比如系统托盘区)。

用SPY++可以清楚的了解,桌面窗口(Desktop)和任务条窗口(taskbar)都是Explorer.exe这个进程创建的,所谓的顶层窗口表现出来都是Desktop的一级子窗口,但是可能实际在系统中确实和Desktop是同级的。

有时候你会发现Win98的Explorer没有响应,将其关闭后,系统会再次执行一个Explorer,除了浏览、文件夹等程序外,其他程序的窗体都能正常显示、而系统托盘区的小图标会丢失一部分。

这个也说明了,应用程序的窗口实际上在核心中记录时是和Desktop没有直接联系,否则父窗口销毁,子窗口是无法存在的。

#37


desktop窗口不是explorer.exe创建的

#38


俺正在做GUI方面的工作,我可以提供一下我们这个系统的相关概念:
1。桌面也是窗口,是一个特殊窗口
2。整个GUI系统中有两种窗口,一种是总在其上的窗口,也就是顶层窗口,还有一种是普通窗口,他们分别形成两个不同的链表。
3。从消息路由角度来说,所有窗口除桌面外都是桌面的子窗口。
呵呵,谢谢!

#39


现在我明白了一些:
1.打开电脑时摆放“我的电脑”等图标的“桌面”非GetDC(0)指的Desktop,这个桌面与taskbar是explorer.exe的两个组件,而后者(Desktop)就是VB中的SCREEN对象
2.在NT中按下ctrl+alt+del所看到的光光的屏幕是否可看作是Desktop?
3.To ggsx() “从消息路由角度来说,所有窗口除桌面外都是桌面的子窗口”这个消息路由角度怎么解释?

多谢各位赐教

up

#40


亲爱的大虾,请同时看我这个贴子:
http://www.csdn.net/Expert/topic/484/484745.shtm

分不够,我再加

#41


如果你使用任务管理起关掉explorer时,你会发现只剩下桌面了,从毛种意义上说,桌面是最低成的窗口,关掉桌面的话,意味着你关掉了window.如果你了解doc/view结构的话,你就知道最后处理消息的窗口是最高称此的窗口,我说得不太清楚,你可以看一看windows程序设计,(sdk 版本)在所有的win32中,都有以下的格式:
switch ( message)
case wm_Command:
default:
return DefWindowProc(hWnd, message, wParam, lParam);
这就是交给windows处理的消息了,如果想拦截的话,必须在这个函数处理之前了。

#42


收藏!

#43


刚才用spy++看了一下“Program Manager"的窗口类是Progman
而资源管理器(explorer.exe)的窗口类是ExploreWClass
看来Progman与exeplorer.exe之间还很暧昧,那么progman是否如Ferchis(神物自晦)所说隶属于exporer.exe呢?


To zhakewei(xiaoma) :

  1.我对doc/view结构不太了解,可以简单说一下吗
  2.在窗口过程中,DefWindowProc(hWnd, message, wParam, lParam);用作默认处理,这个”默认处理“的行动者是windows还是程序本身?
  3.按您的意思,消息是从“低层次”窗口传向“高层次”窗口,那么这个“窗口层次”是怎么个概念呢!

谢谢

#44


原来如此,spy++是怎么用的?

#45


哈哈

#46


大虾还有高见吗!

#47


>1.我的理解:应用程序的窗口应该和桌面窗口是同一层的(例如用刷子刷新桌面时,事实上就是把桌面窗口调到前面来)。
>所以说“所有的应用程序的窗口是桌面窗口的子窗口”就没法理解,而且任务条窗口与桌面窗口的关系呢?

从 CreateWindow( ..., hWndParent, ... ) 可以看出,创建窗口时必须制定父窗口。
如果你传入 NULL,那么 user32.dll 就会用 Desktop 的窗口句柄代替;
如果你传入的不是 NULL,那他也一定是 Desktop 窗口的孙子辈(想一下);
因此,所有应用程序的窗口都是桌面窗口的子窗口。


>2.Progman是否就是shell(explorer.exe),progman与desktop及taskbar的关系

Progman 是 Windows 3.1 的东东,是一个独立的应用程序;Win9X 中也有,但已经很少有人用了;
taskbar 是窗口,也是 desktop 的子窗口。


>3.在spy++中,所有的窗口都在0001000C""#32769[Desktop]下边(包括Progman),这里的Desktop又与Progman之间是什么牵连呢

上面已经解释了。


>4.FindWindowEx(FindWindow("Progman", vbNullString), 0, "shelldll_defview", vbNullString)应该等于getdesktopwindow()(事实上不等)

你这样只能找到 Progman 窗口的子窗口,当然不可能找到 Desktop 了;
GetParent( FindWindow( "Progman", vbNullString ) ) 也许可以。

#48


windows窗口可分为两类,一类是应用程序窗口,是含有标题栏,菜单,工具栏和滚动条等之一,但也可以什么也不包含,就象WINDOWS的桌面,它也是应用程序窗口.另一类是对话框,它可以有标题栏和各种控件,其中每一个小的可视对象都是一个窗口(对话框的子窗口).
WINDOWS程序是由窗口组成,窗口中或窗口间都是以消息来通讯,及每个窗口都有相关的窗口过程,只是现在的语言封装了它以至感觉不到.
窗口通常是在"窗口类"的基础上创建的,窗口类标识了处理窗口消息的窗口过程和窗口样式,实例句柄等重要信息.然后再建立窗口实例,建立窗口实例时返回一个窗口句柄,它就是用来标识窗口的.多个窗口可以基于同一个窗口类,应用程序的窗口是通过自己或动态链接库定义窗口类来创建的,现在的RAD工具简化了这一步由控件来实现,但原理还是一样的.
WINDOWS是由动态链接库来实现的,WINDOWS大多典型的功能由三个主要的子系统KERNEL,USER和GDI来实现(分别对应三个动态链接库).其中USER实现所有窗口逻辑,WINDOWS的DESKTOP的窗口类是EXPLORER程序通过调用USER这个动态链接库来定义,并由EXPLORER程序创建了DESKTOP窗口并处理一些自己的消息.应用程序可以定义自己的窗口类(是通过调用USER子系统,而非EXPLORER),有自己的窗口过程.因此在定义窗口类时,如果不是子窗口我们类成员的父窗口句柄为NULL,因此独立于DESKTOP,就不是DESKTOP的子窗口.

#49


等我看看

谢谢

#50


msdn  ok

#1


跟贴

#2


安装盘里面有个Spy.exe运行后好好看看,也许有帮助.

#3


虽然我不知道,但是你写了“跟贴有分”,只有过来凑凑热闹。

#4


关注

#5


u p

#6


我也对这些问题感兴趣,请高手踊跃发言呀。

#7


高手发言

#8


#9


对不起,尽管我很想回答你的问题,但我要离开这里了,看看
http://www.csdn.net/Expert/topic/490/490851.shtm
就知道为什么了。
如果要找我,请到
http://www.d1vb.com

#10


请您发言,哪怕一点提示或资料、连接,只要能释疑、解惑都行

(多谢大家的关注,分不够的话我会加的)

#11


我还有另外两个问题,您也许能解决:
http://www.csdn.net/Expert/topic/484/484745.shtm
http://www.csdn.net/expert/TopicView.asp?id=484448

对http://www.csdn.net/expert/TopicView.asp?id=484448这个贴子能给一个"创建一个象输入法一样的窗口(得不到焦点,不能active)"的样例,我就结贴。我会继续等的。

谢谢

#12


怎么没人回答呀

#13


跟贴 
我不太清楚,你说跟贴着有分我才跟的。

#14


多谢关注!
up

#15


关注

#16


这段时间怎么没见板主呀,我需要有人解决问题的高手,不然的话CSDN就不行了!

#17


这需要明白windows系统:
Explorer 提供了用户接口,当然,桌面并不基于Explorer 如果没有Explorer 则桌面上空的。

1.我的理解:应用程序的窗口应该和桌面窗口是同一层的(例如用刷子刷新桌面时,事实上就是把桌面窗口调到前面来)。——这是由GDI对屏幕所作的假象
所以说“所有的应用程序的窗口是桌面窗口的子窗口”就没法理解,而且任务条窗口与桌面窗口的关系呢?——如果不启动 Explorer 而启动另一程序仍可运行。所以这个关系是相对的。

2.Progman是否就是shell(explorer.exe),progman与desktop及taskbar的关系
desktop及taskbar是explorer.exe程序的一部分


3.在spy++中,所有的窗口都在0001000C""#32769[Desktop]下边(包括Progman),这里的Desktop又与Progman之间是什么牵连呢
实际是独立的

4.FindWindowEx(FindWindow("Progman", vbNullString), 0, "shelldll_defview", vbNullString)应该等于getdesktopwindow()(事实上不等)
确实不是同一窗口。因为是两个EXE

看来我还有些不太明白。仅供参考!

#18


我也关注

#19


巴顿先生作了简要的提示,但是desktop explorer及progman间的关系仍然是含糊和矛盾的

是不是VB版的朋友对windows系统的组成及机制不甚了解呀。再等一天,不行的话,改贴到VC版,哎!

#20


跟贴

#21


我也学习一下.:)

#22


今天我打开尘封已久的《Programming in windows3.1》(Microsoft Press),虽然太老,与现在相比经典的东西还不算过时,但1000多页看到何时。哪位介绍一下有关windows机制或经典API的书,以有利于解决这类的问题!

等待您的指导

#23


这两个贴子也是我的
http://www.csdn.net/Expert/topic/484/484745.shtm
http://www.csdn.net/expert/TopicView.asp?id=484448
在后面跟贴也有分的!(我还有几千分,我愿用所有的分换取您的答复)


(CSDN在我的工作中很重要,为什么这次让我如此疲惫,你不能让我失望呀!!!)

#24


改贴到VC++吧!

#25


输入法窗口,实际是两种窗口:
输入法状态栏是Region, 是由Rgn相关函当选操作出来的。
输入法的文字显示窗口则是windows 窗口类中的IME

以下代码演示用VB创建IME窗口

module:

Option Explicit

Public Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type



Form1:

Option Explicit

Private Declare Function CreateWindowEx Lib "user32" _
    Alias "CreateWindowExA" (ByVal dwExStyle As Long, _
                             ByVal lpClassName As String, _
                             ByVal lpWindowName As String, _
                             ByVal dwStyle As Long, _
                             ByVal x As Long, _
                             ByVal y As Long, _
                             ByVal nWidth As Long, _
                             ByVal nHeight As Long, _
                             ByVal hWndParent As Long, _
                             ByVal hMenu As Long, _
                             ByVal hInstance As Long, _
                             lpParam As Any) As Long
                             

Private Const WM_CREATE = &H1

Private Const WS_EX_TOPMOST = &H8&

Private Const WS_EX_LEFT = &H0

Private Const WS_EX_LTRREADING = &H0
Private Const WS_EX_RIGHTSCOLLBAR = &H0

Private Const WS_BORDER = &H800000

Private Const WS_POPUP = &H80000000


Private Const WS_DISABLED = &H8000000
Private Const WS_CLIPSIBLINGS = &H4000000
Private Const WS_OVERLAPPED = &H0&


Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Private Const SW_NORMAL = 1
Private Const SW_PARENTOPENING = 3
Private Const SW_SHOW = 5

Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long



Private Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long

Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long

Private Declare Function FrameRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal HBRUSH As Long) As Long

Private Declare Function FillRgn Lib "gdi32" (ByVal hdc As Long, ByVal HRGN As Long, ByVal HBRUSH As Long) As Long

Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long


Dim HwndNew As Long

Private Sub Form_Load()
    
    Dim LREC As RECT
    
    Dim Hrect As Long
    
    Dim Hwdc As Long
    
    Dim WCOLOR As Long
    
    Dim HBRUSH As Long
    
    Dim HRGN As Long
        
    HwndNew = CreateWindowEx(WS_EX_TOPMOST, "IME", "New", WS_POPUP Or WS_DISABLED Or WS_CLIPSIBLINGS Or WS_OVERLAPPED, _
                0, 0, 200, 200, Me.hwnd, 0, 0, WM_CREATE)
                Debug.Print HwndNew
    
    ShowWindow HwndNew, SW_NORMAL
                 
    Hrect = GetClientRect(HwndNew, LREC)
    
    Hwdc = GetDC(HwndNew)
    
    WCOLOR = RGB(255, 255, 255)
    
    HRGN = CreateRectRgn(LREC.Left, LREC.Top, LREC.Right, LREC.Bottom)
    
    HBRUSH = CreateSolidBrush(WCOLOR)
    
    FillRgn Hwdc, HRGN, HBRUSH
    
End Sub

Private Sub Form_Unload(Cancel As Integer)
    DestroyWindow HwndNew
End Sub


 

#26


看来只有改到vc++中了

#27


VC的朋友 ,帮帮忙呀!

#28


芬纷纷!

#29


help me

#30


desktop窗口是最基本的窗口,当win32环境子系统运行后就有了,不依赖explorer.exe

progman是explorer.exe这个shell运行后才有的,隶属于exporer.exe.
taskbar 也一样属于explorer.exe进程

我个人的猜测:在spy++里desktop下的一层窗口就是top-level window,文档上说没有父窗口的窗口就是top-level窗口,我想也许更接近事实的说法是父窗口是desktop的窗口就是
top-level 窗口

#31


涨见识了  :)

#32


学到东西了!·!!

#33


我要分

#34


多谢Ferchis(神物自晦):

Desktop是否可以理解为整个屏幕(screen)(如GetDC(0)得到的是screen的HDC)

那么存放图标的那个"桌面"就不应该是以上所说的Desktop,它应是explorer.exe的一部分
否则FindWindowEx(FindWindow("Progman", vbNullString), 0, "shelldll_defview", vbNullString)应该等于getdesktopwindow()(事实上不等)


#35


Desktop这个窗口不能理解为整个屏幕,它覆盖了整个屏幕
GetDC(0)得到的是整个屏幕的DC

HDC hDC = ::GetDC(::GetDesktopWindow()); // method 1
//HDC hDC = ::GetDC(0); // method 2
::TextOut(hDC,100,100,"333",3);

用一个程序试一下上面的代码的两种情况,你会发现 method1什么也画不出来
method2 可以在(100,100)那个地方任意画.

#36


大家探讨一下,我也说说我的观点,也许不成熟,仅供参考。
Win32系统提供了图形界面的底层操作和管理,而Explorer仅仅用这些方法实现了图形界面,实际上完全可以用另外的shell程序来实现(这点可以看看system.ini中的shell=Explorer.exe),从这点意义上说,Explorer.exe和其他Win32应用程序并没有本质上的不同,只不过Explorer.exe实现了很多特殊的功能而已(比如系统托盘区)。

用SPY++可以清楚的了解,桌面窗口(Desktop)和任务条窗口(taskbar)都是Explorer.exe这个进程创建的,所谓的顶层窗口表现出来都是Desktop的一级子窗口,但是可能实际在系统中确实和Desktop是同级的。

有时候你会发现Win98的Explorer没有响应,将其关闭后,系统会再次执行一个Explorer,除了浏览、文件夹等程序外,其他程序的窗体都能正常显示、而系统托盘区的小图标会丢失一部分。

这个也说明了,应用程序的窗口实际上在核心中记录时是和Desktop没有直接联系,否则父窗口销毁,子窗口是无法存在的。

#37


desktop窗口不是explorer.exe创建的

#38


俺正在做GUI方面的工作,我可以提供一下我们这个系统的相关概念:
1。桌面也是窗口,是一个特殊窗口
2。整个GUI系统中有两种窗口,一种是总在其上的窗口,也就是顶层窗口,还有一种是普通窗口,他们分别形成两个不同的链表。
3。从消息路由角度来说,所有窗口除桌面外都是桌面的子窗口。
呵呵,谢谢!

#39


现在我明白了一些:
1.打开电脑时摆放“我的电脑”等图标的“桌面”非GetDC(0)指的Desktop,这个桌面与taskbar是explorer.exe的两个组件,而后者(Desktop)就是VB中的SCREEN对象
2.在NT中按下ctrl+alt+del所看到的光光的屏幕是否可看作是Desktop?
3.To ggsx() “从消息路由角度来说,所有窗口除桌面外都是桌面的子窗口”这个消息路由角度怎么解释?

多谢各位赐教

up

#40


亲爱的大虾,请同时看我这个贴子:
http://www.csdn.net/Expert/topic/484/484745.shtm

分不够,我再加

#41


如果你使用任务管理起关掉explorer时,你会发现只剩下桌面了,从毛种意义上说,桌面是最低成的窗口,关掉桌面的话,意味着你关掉了window.如果你了解doc/view结构的话,你就知道最后处理消息的窗口是最高称此的窗口,我说得不太清楚,你可以看一看windows程序设计,(sdk 版本)在所有的win32中,都有以下的格式:
switch ( message)
case wm_Command:
default:
return DefWindowProc(hWnd, message, wParam, lParam);
这就是交给windows处理的消息了,如果想拦截的话,必须在这个函数处理之前了。

#42


收藏!

#43


刚才用spy++看了一下“Program Manager"的窗口类是Progman
而资源管理器(explorer.exe)的窗口类是ExploreWClass
看来Progman与exeplorer.exe之间还很暧昧,那么progman是否如Ferchis(神物自晦)所说隶属于exporer.exe呢?


To zhakewei(xiaoma) :

  1.我对doc/view结构不太了解,可以简单说一下吗
  2.在窗口过程中,DefWindowProc(hWnd, message, wParam, lParam);用作默认处理,这个”默认处理“的行动者是windows还是程序本身?
  3.按您的意思,消息是从“低层次”窗口传向“高层次”窗口,那么这个“窗口层次”是怎么个概念呢!

谢谢

#44


原来如此,spy++是怎么用的?

#45


哈哈

#46


大虾还有高见吗!

#47


>1.我的理解:应用程序的窗口应该和桌面窗口是同一层的(例如用刷子刷新桌面时,事实上就是把桌面窗口调到前面来)。
>所以说“所有的应用程序的窗口是桌面窗口的子窗口”就没法理解,而且任务条窗口与桌面窗口的关系呢?

从 CreateWindow( ..., hWndParent, ... ) 可以看出,创建窗口时必须制定父窗口。
如果你传入 NULL,那么 user32.dll 就会用 Desktop 的窗口句柄代替;
如果你传入的不是 NULL,那他也一定是 Desktop 窗口的孙子辈(想一下);
因此,所有应用程序的窗口都是桌面窗口的子窗口。


>2.Progman是否就是shell(explorer.exe),progman与desktop及taskbar的关系

Progman 是 Windows 3.1 的东东,是一个独立的应用程序;Win9X 中也有,但已经很少有人用了;
taskbar 是窗口,也是 desktop 的子窗口。


>3.在spy++中,所有的窗口都在0001000C""#32769[Desktop]下边(包括Progman),这里的Desktop又与Progman之间是什么牵连呢

上面已经解释了。


>4.FindWindowEx(FindWindow("Progman", vbNullString), 0, "shelldll_defview", vbNullString)应该等于getdesktopwindow()(事实上不等)

你这样只能找到 Progman 窗口的子窗口,当然不可能找到 Desktop 了;
GetParent( FindWindow( "Progman", vbNullString ) ) 也许可以。

#48


windows窗口可分为两类,一类是应用程序窗口,是含有标题栏,菜单,工具栏和滚动条等之一,但也可以什么也不包含,就象WINDOWS的桌面,它也是应用程序窗口.另一类是对话框,它可以有标题栏和各种控件,其中每一个小的可视对象都是一个窗口(对话框的子窗口).
WINDOWS程序是由窗口组成,窗口中或窗口间都是以消息来通讯,及每个窗口都有相关的窗口过程,只是现在的语言封装了它以至感觉不到.
窗口通常是在"窗口类"的基础上创建的,窗口类标识了处理窗口消息的窗口过程和窗口样式,实例句柄等重要信息.然后再建立窗口实例,建立窗口实例时返回一个窗口句柄,它就是用来标识窗口的.多个窗口可以基于同一个窗口类,应用程序的窗口是通过自己或动态链接库定义窗口类来创建的,现在的RAD工具简化了这一步由控件来实现,但原理还是一样的.
WINDOWS是由动态链接库来实现的,WINDOWS大多典型的功能由三个主要的子系统KERNEL,USER和GDI来实现(分别对应三个动态链接库).其中USER实现所有窗口逻辑,WINDOWS的DESKTOP的窗口类是EXPLORER程序通过调用USER这个动态链接库来定义,并由EXPLORER程序创建了DESKTOP窗口并处理一些自己的消息.应用程序可以定义自己的窗口类(是通过调用USER子系统,而非EXPLORER),有自己的窗口过程.因此在定义窗口类时,如果不是子窗口我们类成员的父窗口句柄为NULL,因此独立于DESKTOP,就不是DESKTOP的子窗口.

#49


等我看看

谢谢

#50


msdn  ok