科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件感悟VB细水长流话API(六-2)

感悟VB细水长流话API(六-2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

这里又是一个特别的例子,图像处理我还会两下,不过这可不是处理来的,而是真实的抓图。我把开始按钮移到这里来了。再看看图6,怎么样?有意思吧?

作者:张鸿 来源:soft6 2008年5月15日

关键字: API 感悟 VB vb.net Windows

  • 评论
  • 分享微博
  • 分享邮件

感悟VB细水长流话API(六-1)

第九话 寻找子窗口

  这里又是一个特别的例子,图像处理我还会两下,不过这可不是处理来的,而是真实的抓图。我把开始按钮移到这里来了。再看看图6,怎么样?有意思吧?

这里我要介绍几个API:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long

Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long

  首先是FindWindow。FindWindow可以根据所给的条件,从桌面上寻找一个窗口,lpClassName是窗口的类名,而lpWindowName是窗口的标题。我们可以传递lpClassName,让它找符合的类名的窗口,或传递 lpWindowName,让它找符合的标题的窗口,如果我们不需要两个条件都符合,则另一个参数可以传递vbNullString,让它忽略。它的返回值就是找到的窗口的句柄。

  那么什么是类名?避开C++的相关术语来说,其实Windows的窗口都是某种类中的一种,这个“类”可以是Textbox、 Combobox,也可以是由用户来定义的,这个窗口是属于哪一类的,它的类名就是什么。GetWindow也可以用来寻找某个窗口并返回其句柄,但它只限于在某个窗口中寻找子窗口,因此它需要传递hWnd以表示在哪个窗口里寻找。而 wCmd用来描述要找的子窗口与父窗口的关系。它的值如下:

GW_CHILD:寻找第一个子窗口

GW_HWNDFIRST:寻找第一个同级窗口,或寻找第一个顶级窗口

GW_HWNDLAST:寻找最后一个同级窗口,或寻找最后一个顶级窗口

GW_HWNDNEXT:寻找下一个同级窗口

GW_HWNDPREV:寻找前一个同级窗口

GW_OWNER:寻找窗口的所有者(即父窗口)

  我们先来理解什么是同级窗口和顶级窗口。打个比方,如果一个窗口有三个子窗口,则这三个窗口都是同一级的,互为同级窗口。如果我们从没寻找过一个子窗口,那么API 不知道我们要找的是和哪个窗口同级,那么此时它找的是顶级窗口,顶级窗口即是子窗口,但这个子的关系是直接的,而不会是子窗口的子窗口(即孙子,别笑,这里的术语不是我自己造的)。最后一个GetClassName和以前讲过的几个字符串相关的API用法差不多,hWnd是窗口句柄,lpClassName是用来接收窗口类名的缓冲区,nMaxCount则是说明缓冲区的大小。


 

[下一页]


 

那么接下来我是如何用它们的呢?看这里:

Dim hTaskbar As Long, hStartbutton As Long

Dim sClass As String * 250


hTaskbar = FindWindow("Shell_traywnd", vbNullString)

hStartbutton = GetWindow(hTaskbar, GW_CHILD)


Do

GetClassName hStartbutton, sClass, 250

If LCase(Left$(sClass, 6)) = "button" Then Exit Do

hStartbutton = GetWindow(hStartbutton, GW_HWNDNEXT)

Loop

  我使用FindWindow从桌面上找到了一个类名为 “Shell_traywnd”的窗口,它就是任务栏(不要问我是怎么知道它的类名的)。然后我又用GetWindow函数,从任务栏找到第一个子窗口。接下来,我用一个Do…Loop结构的循环为上一次找到的子窗口检查其类名,如果类名是button,则说明是个按钮,一般来说,任务栏上只有一个是button类的,所以一找到,它势必就是“开始”按钮了。如果没找到,则仍使用GetWindow,但这次和第一次不同,我传递的不是任务栏的句柄,而是上一次找到的子窗口的句柄,为的是找下一个同级窗口,就这样一次次循环直到找到开始按钮。

  那么,开始按钮就被我这么找到了,然后我就可以像对待其他窗口一样对待它:比如将它移动。不要忘了上一期所讲的内容,SetWindowPos将在这里产生作用,你可以移动它,或者为最后一个参数组合上SWP_HIDEWINDOW,让开始按钮变得不可见,或者组合SWP_SHOWWINDOW重新显示……

  接下来轮到任务栏了,你从图6中可以看到在开始按钮的位置有另一个“厉害”的按钮取代它,这是上一话的内容:SetParent。我用SetParent为原本在Form1上的按钮指定了新的父窗口——任务栏。如果你查看我的示例源程序,你会发现在此按钮的GotFocus事件中,我把焦点转移给了另一个按钮,原因在上一话已经说了。

  在示例源程序中,我还演示了隐藏和显示任务栏,仍然是SetWindowPos的功劳,提醒一下,为了不改变窗口的一些属性,要在最后一个参数组合上合适的值。

  好了,这一期的内容就这么多,我想这一次你应该好好研究我的源程序,里面的东西涉及到上一期和本期的内容,把它消化下去吧。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章