先GetWindow,FindWindow得到句柄myhwnd后Showwindow myhwnd与直接ShowWindow Me.hwnd的区别

xingxingxiangrong 2009-02-24 12:45:32

Private Sub Form_Load()
Dim myhwnd As Long
myhwnd = GetWindow(Me.hwnd, GW_OWNER)
ShowWindow myhwnd, SW_HIDE
End Sub

Private Sub Form_Load()
Dim myhwnd As Long
'myhwnd = GetWindow(Me.hwnd, GW_OWNER)
ShowWindow Me.hwnd, SW_HIDE
End Sub

Private Sub Form_Load()
Dim myhwnd As Long
myhwnd = FindWindow(vbNullString, "工程1")
ShowWindow myhwnd, SW_HIDE
End Sub




有什么区别了,其中第一个与第三个运行结果一样
...全文
332 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2009-02-24
  • 打赏
  • 举报
回复
GetWindow是获取窗口句柄
FindWindow是查找对应的窗口句柄,它可以查找别的程序中的窗口等
xingxingxiangrong 2009-02-24
  • 打赏
  • 举报
回复
GetWindow所得的myhwnd好像重新运行就又变了
东方之珠 2009-02-24
  • 打赏
  • 举报
回复
你在Command1中加一行: Me.Print Me.hwnd, myhwnd, Command1.hwnd
看看这些句柄值就知道了。没什么奇怪的,GetWindow不可靠,有时候行,有时候不行!
刚才我试6楼的时候,效果全都一样!
xingxingxiangrong 2009-02-24
  • 打赏
  • 举报
回复
我还是搞不清楚,但刚才用


Private Sub Command1_Click()
Dim myhwnd As Long
myhwnd = GetWindow(Me.hwnd, GW_OWNER)
ShowWindow myhwnd, SW_HIDE
End Sub
这个在在任务管理器应用程序栏不见,但窗体可见
Private Sub Command1_Click()
ShowWindow me.hwnd, SW_HIDE
End Sub
这个在任务管理器应用程序栏可见,但窗体不见

好像越来越乱了
东方之珠 2009-02-24
  • 打赏
  • 举报
回复
你在Form_Load中都加入一个msgbox("xcvbcxvb")试一下就知道了,实际上先是隐藏了,然后再绘制的窗口,也就是说form_load()中代码执行完毕后,才开始绘制窗口。如果你把这些代码放在Command1按钮中会立即见效!

Private Sub Form_Load()
Dim myhwnd As Long
myhwnd = GetWindow(Me.hwnd, GW_OWNER)
ShowWindow myhwnd, SW_HIDE
MsgBox ("zxvbsdfbv")
End Sub



Private Sub Form_Load()
'Dim myhwnd As Long
'myhwnd = GetWindow(Me.hwnd, GW_OWNER)
ShowWindow Me.hwnd, SW_HIDE
MsgBox ("xfgbsdfg")
End Sub


Private Sub Form_Load()
Dim myhwnd As Long
myhwnd = FindWindow(vbNullString, "工程1")
ShowWindow myhwnd, SW_HIDE
MsgBox ("xfvbxcvbxcvb!")
End Sub
xingxingxiangrong 2009-02-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 verywzm 的回复:]
引用 3 楼 xingxingxiangrong 的回复:
那下面的两段到底有什么区别了
Private Sub Form_Load()
Dim myhwnd As Long
myhwnd = GetWindow(Me.hwnd, GW_OWNER)
ShowWindow myhwnd, SW_HIDE
End Sub

Private Sub Form_Load()
Dim myhwnd As Long
'myhwnd = GetWindow(Me.hwnd, GW_OWNER)
ShowWindow Me.hwnd, SW_HIDE
End Sub


区别在myhwnd不一定就是自己的句柄,有可能只是符合你查找条件的一个窗…
[/Quote]
既然Me.hwnd一定是自己的句柄,那为什么ShowWindow Me.hwnd, SW_HIDE 在任务管理器应用程序栏不能隐藏,但ShowWindow myhwnd, SW_HIDE 在任务管理器应用程序栏隐藏???
verywzm 2009-02-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xingxingxiangrong 的回复:]
那下面的两段到底有什么区别了
Private Sub Form_Load()
Dim myhwnd As Long
myhwnd = GetWindow(Me.hwnd, GW_OWNER)
ShowWindow myhwnd, SW_HIDE
End Sub

Private Sub Form_Load()
Dim myhwnd As Long
'myhwnd = GetWindow(Me.hwnd, GW_OWNER)
ShowWindow Me.hwnd, SW_HIDE
End Sub
[/Quote]

区别在myhwnd不一定就是自己的句柄,有可能只是符合你查找条件的一个窗口句柄,而Me.hwnd一定是自己的句柄
xingxingxiangrong 2009-02-24
  • 打赏
  • 举报
回复
那下面的两段到底有什么区别了
Private Sub Form_Load()
Dim myhwnd As Long
myhwnd = GetWindow(Me.hwnd, GW_OWNER)
ShowWindow myhwnd, SW_HIDE
End Sub

Private Sub Form_Load()
Dim myhwnd As Long
'myhwnd = GetWindow(Me.hwnd, GW_OWNER)
ShowWindow Me.hwnd, SW_HIDE
End Sub
东方之珠 2009-02-24
  • 打赏
  • 举报
回复
你这个只是巧合。在任务管理中,可能会很多进程的窗口名都为"工程1",但它们的句柄却不一样。
看看下面这些资料:


GetWindow  函数功能:该函数返回与指定窗口有特定关系(如Z序或所有者)的窗口句柄。
  函数原型:HWND GetWindow(HWND hWnd,UNIT nCmd);
  参数:
  hWnd:窗口句柄。要获得的窗口句柄是依据nCmd参数值相对于这个窗口的句柄。
  nCmd:说明指定窗口与要获得句柄的窗口之间的关系。该参数值可以是下列之一:
  GW_CHILD:如果指定窗口是父窗口,则获得的是在Z序顶端的子窗口的句柄,否则为NULL。函数仅检查指定父窗口的子窗口,不检查继承窗口。
  GW_ENABLEDPOUP:(WindowsNT 5.0)返回的句柄标识了属于指定窗口的处于使能状态弹出式窗口(检索使用第一个由GW_HWNDNEXT 查找到的满足前述条件的窗口);如果无使能窗口,则获得的句柄与指定窗口相同。
  GW_HWNDFIRST:返回的句柄标识了在Z序最高端的相同类型的窗口。如果指定窗口是最高端窗口,则该句柄标识了在Z序最高端的最高端窗口;如果指定窗口是顶层窗口,则该句柄标识了在z序最高端的顶层窗口:如果指定窗口是子窗口,则句柄标识了在Z序最高端的同属窗口。
  GW_HWNDLAST:返回的句柄标识了在z序最低端的相同类型的窗口。如果指定窗口是最高端窗口,则该柄标识了在z序最低端的最高端窗口:如果指定窗口是顶层窗口,则该句柄标识了在z序最低端的顶层窗口;如果指定窗口是子窗口,则句柄标识了在Z序最低端的同属窗口。
  GW_HWNDNEXT:返回的句柄标识了在Z序中指定窗口下的相同类型的窗口。如果指定窗口是最高端窗口,则该句柄标识了在指定窗口下的最高端窗口:如果指定窗口是顶层窗口,则该句柄标识了在指定窗口下的顶层窗口;如果指定窗口是子窗口,则句柄标识了在指定窗口下的同属窗口。
  GW HWNDPREV:返回的句柄标识了在Z序中指定窗口上的相同类型的窗口。如果指定窗口是最高端窗口,则该句柄标识了在指定窗口上的最高端窗口;如果指定窗口是顶层窗口,则该句柄标识了在指定窗口上的顶层窗口;如果指定窗口是子窗口,则句柄标识了在指定窗口上的同属窗口。
  GW_OWNER:返回的句柄标识了指定窗口的所有者窗口(如果存在)。
  返回值:如果函数成功,返回值为窗口句柄;如果与指定窗口有特定关系的窗口不存在,则返回值为NULL。
  若想获得更多错误信息,请调用GetLastError函数。
  备注:在循环体中调用函数EnumChildWindow比调用GetWindow函数可靠。调用GetWindow函数实现该任务的应用程序可能会陷入死循环或退回一个已被销毁的窗口句柄。




findwindow  FindWindow,Win32 API函数。
  FindWindow函数返回与指定字符创相匹配的窗口类名或窗口名的最顶层窗口的窗口句柄。这个函数不会查找子窗口。
  函数原型:
  HWND FindWindow
  (
  LPCTSTR lpClassName,
  LPCTSTR lpWindowName
  );
  参数表:
  lpClassName
  指向一个以null结尾的、用来指定类名的字符串或一个可以确定类名字符串的原子。如果这个参数是一个原子,那么它必须是一个在调用此函数前已经通过GlobalAddAtom函数创建好的全局原子。这个原子(一个16bit的值),必须被放置在lpClassName的低位字节中,lpClassName的高位字节置零。
  lpWindowName
  指向一个以null结尾的、用来指定窗口名(即窗口标题)的字符串。如果此参数为NULL,则匹配所有窗口名。
  返回值:
  如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。
  如果函数执行失败,则返回值为 NULL 。可以通过调用GetLastError函数获得更加详细的错误信息。
  快捷信息:
  导入库:user32.lib
  头文件:winuser.h
  ***.Net 中运用
  命名空间 using System.Runtime.InteropServices;
  导入库 [DllImport("user32.dll")]
  函数原型 public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  参数说明 lpClassName String,指向包含了窗口类名的空中止(C语言)字串的指针;或设为零,表示接收任何类
  lpWindowName String,指向包含了窗口文本(或标签)的空中止(C语言)字串的指针;或设为零,表示接收 任何窗口标题
  返回值 :句柄

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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