首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ShowWindowAsync()不显示隐藏窗口(SW_SHOW)

ShowWindowAsync()不显示隐藏窗口(SW_SHOW)
EN

Stack Overflow用户
提问于 2011-05-01 08:58:52
回答 4查看 4.2K关注 0票数 1

你好,我在用Visual Basic 2008

这里的是我代码的一部分:

代码语言:javascript
运行
复制
    Private Const SW_HIDE As Integer = 0
    Private Const SW_SHOW As Integer = 5

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
     Private Shared Function ShowWindowAsync(ByVal hwnd As IntPtr, ByVal nCmdShow As Integer) As Boolean
        End Function

button1代码:

代码语言:javascript
运行
复制
            Try
               Dim p() As Process = Process.GetProcessesByName("notepad")
               Dim mwh = p(0).MainWindowHandle
               ShowWindowAsync(mwh, SW_HIDE)
            Catch ex As Exception
               MsgBox("error")
            End Try      

button2代码:

代码语言:javascript
运行
复制
            Try         
               Dim p() As Process = Process.GetProcessesByName("notepad")
               Dim mwh = p(0).MainWindowHandle
               ShowWindowAsync(mwh, SW_SHOW)
            Catch ex As Exception
               MsgBox("error")
            End Try  

当我单击button 1 (隐藏窗口)时,效果很好,但是当我想返回窗口时(单击button 2 ),函数返回FALSE,谁能告诉我为什么?如何让它工作,隐藏窗口,然后再展示它呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-01 09:02:47

因为ShowWindowAsync() returns zero when the window was previously hidden according to the MSDN documentation和零被解释为FALSE。返回值并不表示函数是否成功。

因此,当您第一次在可见窗口上调用ShowWindowAsync(mwh, SW_HIDE)时,函数返回TRUE,因为ShowWindowAsync()返回一个非零值,指示以前是可见的窗口(即现在/将被隐藏)。

然后,隐藏窗口上的第二个调用ShowWindowAsync(mwh, SW_SHOW)返回FALSE,因为ShowWindowAsync()返回一个零值,指示过去隐藏的窗口(现在是/将可见)。

换句话说,这是按设计进行的,函数应该按预期工作(除非mwh窗口没有响应消息或无效)。

但真正的问题是,一旦你隐藏了一个窗口,Process::MainWindowHandle property doesn't have the handle anymore

进程只有在进程具有图形界面的情况下才具有与其关联的主窗口。如果关联进程没有主窗口,则MainWindowHandle值为零。对于已隐藏的进程,即在任务栏中不可见的进程,值也为零。如果进程在任务栏的最右侧显示为通知区域中的图标,则可以使用

您应该做的是通过p(0).MainWindowHandle一次获得窗口句柄,并将返回的句柄保存在某个地方,以便显示/隐藏窗口。当然,当窗口被目标进程破坏时,您应该确保将保存的句柄调零。在记事本的情况下,您可以使用Process::Exited event

票数 3
EN

Stack Overflow用户

发布于 2011-05-01 09:03:09

听起来像是“精心设计”。不要将"false“的返回值视为错误。

根据MSDN:

代码语言:javascript
运行
复制
If the window was previously visible, the return value is nonzero.

If the window was previously hidden, the return value is zero. 

http://msdn.microsoft.com/en-us/library/ms633549%28VS.85%29.aspx

您可以通过将函数的互操作导入声明为32位整数类型而不是布尔值类型来阻止异常发生。

代码语言:javascript
运行
复制
Private Shared Function ShowWindowAsync(ByVal hwnd As IntPtr, ByVal nCmdShow As Integer) As Integer
票数 1
EN

Stack Overflow用户

发布于 2011-05-15 17:16:03

当我藏起来的时候:

代码语言:javascript
运行
复制
WindowHandle = Proc(0).MainWindowHandle
ShowWindowAsync(Proc(0).MainWindowHandle, ShowWindowConstants.SW_HIDE)

然后在显示我使用WindowHandle变量时:

代码语言:javascript
运行
复制
ShowWindowAsync(WindowHandle, ShowWindowConstants.SW_SHOW)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5847481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档