理论:
    GetDesktopWindow是取得代表整个屏幕的窗口的句柄。
    WindowFromPoint是取得包含指定点的窗口的句柄。
    要是把鼠标指针放在桌面,用GetCursorPos取得鼠标的位置点,后用WindowFromPoint取得此时
鼠标位置点的窗口的句柄。应该和GetDesktopWindow取得的句柄应该是相同的。测试:
    在Form1上放二个edit,一个button.(设置button在Form1显示时拥有焦点)
button的onclick事件代码如下:procedure TForm1.Button1Click(Sender: TObject);
var
  a,c:HWND;
  b:Tpoint;
begin
  a:=GetDesktopWindow;
  edit1.Text :='GetDeskTopWindow    '+inttostr(a);
  getcursorpos(b);
  c:=WindowFromPoint(b);
  edit2.Text :='WindowFromPoint    '+inttostr(c);
end; 
    
注意:当Form1显示后把鼠标放到桌面上,不在Form1里。因为button1一开始就有焦点,所以,只要按
一下Enter键就可测试了。结果如下(我的电脑是这样的):
    edit1上显示:GetDeskTopWindow    65556
    edit2上显示:WindowFromPoint    786598多次测试的结果表明两者不相同???我自己也不知道是怎么回事,是不是我的“理论”错了。还请高手指点。

解决方案 »

  1.   

    桌面窗口就不兴有子窗口吗?你可以用Spy++看看。
      

  2.   

    看来你对桌面的概念还不是很清楚,其实所有的窗体都是桌面窗口的子窗口,若楼上所言,你用spy++能看的很清楚。getdesktopwindow的确可以得到桌面的句柄。但是比如 开始按钮,任务栏等也是桌面的子窗口。那些图标也不是就放在桌面上的,而是在 一个类命为syslistview32的窗口上的。而你WindowFromPoint的方法只是得到它的句柄而已。
    楼上说的没错,你可以用spy++好好看看。
      

  3.   

    判断得到的句柄是不是syslistview32的句柄吗
      

  4.   

    “我的电脑”里也有syslistview32类的句柄呀!!