Windows 是不是有保留的窗口句柄?(100分)

  • 主题发起人 主题发起人 @_@
  • 开始时间 开始时间
@

@_@

Unregistered / Unconfirmed
GUEST, unregistred user!
WINDOWS 是不是保留使用了一些窗口句柄?$80的句柄是不是保留给桌面使用了?$8C 的呢?

嘿嘿,谢谢大家。

补允一下,大家好!我是新来的。
 
何以见得呢?
 
应该没有
 
我是想编写一个程序,产生一个类似WINDOWS输入法的窗口,总是最前面,就算是应用程序都已经隐藏了,这个窗口也能显示出来,而且显示时WINDOWS在任务栏也不会显示。

我想这种窗口也应该有一个父窗口的句柄的,但我对WINDOWS的API知道不太多(嘿嘿,WINDOWS的API程序太多了),找不有什么办法,就编写了如下一个小程序。

program Project1;

uses
Forms,
windows,
Dialogs;

{$R *.RES}
var
H1, H2: HWND;
begin
H1 := GetDesktopWindow; //取得桌面窗口句柄
H2 := GetTopWindow(H1); //这个是什么我就不太清楚了,也许是在指定句柄的上面的窗口
ShowMessageFmt('H1 = %p'#13'H2 = %p',
[Pointer(H1), Pointer(H2)]);
Application.Initialize;
Application.Run;
end.

把这个程序编译好后放在桌面上,关闭所有窗口。在桌面上运行,结果,发现显示出来的窗口句柄总是同一值:
H1 = $80, H2 = $8C

因为已经关闭了所有窗口,我想 H1就应该是桌面的句柄了(DELPHI 带的WINSIGHT32也显示是$80),H2是什么我就不太清楚。

我想如果不是保留了这两个值(也许更多),那么有什么办法能找到这个句柄 H2 的值吗?
 
我还想补充一下,我是在WINDOWS 98 下发现的,并换了多台电脑,
我正在找WINDOW 95 和 NT 测试

我想知道是不是WINDOWS 真有保留的窗口句柄,是否公布了,这样的话,
我的程序不会存在兼容的问题。

以下是一个测试程序:

program Project1;

uses
Unit3 in 'Unit3.pas',//注意一定要放在这儿,第一行
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};

{$R *.RES}

begin
IsLibrary := false;
Application.Handle := $8C; //这个句柄是不是保留的?我不知道,讨论的就是它
Form2 := Tform2.Create(nil);
Application.CreateHandle;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Form2.Show;
Application.Run;
end.

下面的 UNIT3.PAS
unit Unit3;

interface

implementation

initialization
IsLibrary := true
end.

FORM1 是一个普通的DELPHI FORM,其ONCLOSE事件代码只是隐藏掉窗口和应用程序,如下:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caNone;
Hide;
ShowWindow(Application.Handle, SW_HIDE);
end;

FORM2 将其 FormStyle 设成 fsStayOnTop,并将窗口适当调小
其OnDblClick事件代码用来退出程序:
procedure TForm2.FormDblClick(Sender: TObject);
begin
Application.Terminate;
end;

现在可以运行此程序了,会打开两个窗口,关闭FORM1,会隐藏应用程序。
但FORM2却在,看看状态栏,没有显示。

再点击任务栏上的“显示桌面”或“最小化所有窗口”,
会发现FORM2并没有最小化,还是显示出来的,并且任务栏没有此窗口。


好了。再问问大家,是不是WINDOWS保留了此句柄。如果没有的话,有什么办法能
找到此句柄吗?
 
》我是想编写一个程序,产生一个类似WINDOWS输入法的窗口,总是最前面
你可以把自己的程序放入右下角,查一下已答问题。
要想输入法一样用热键激活,做个hook
 
$80 是 windows 的 desktop 句柄, 用 GetDeskTopWindow 可以得到 $80;
这样就与 GetDC(0) 有点混淆,根据 msdn 说:
当 GetDC 的参数为 NULL (delphi 中为 0), 得到的是 device context of
the entire screen , 也就是真个屏幕的 DC, 用这个 DC 可以在屏幕上
画图,而用 GetDC($80) 得到的 DC 画出来看不见,
可见屏幕上所有的东西都是在 DeskTop 上的,可以试试把 一个 form 的 parent
设为 $80, 看有什么结果。
 
多人接受答案了。
 
后退
顶部