首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VB.NET GetClientRect()在WinForm中不返回子进程的任何内容

VB.NET GetClientRect()在WinForm中不返回子进程的任何内容
EN

Stack Overflow用户
提问于 2017-05-11 04:32:10
回答 1查看 542关注 0票数 1

在VS 2017上用VB.NET编写一个VB.NET项目,我将在SplitContainer2.Panel1中打开FreeRDP的一个实例。这是很好的工作,但我想缩放的形式,最初适合FreeRDP窗口。为了做到这一点,我首先需要知道FreeRDP实例的大小。

不幸的是,我所做的每一次尝试都没有回报。我正在尝试使用Windows中的GetClientRect(),但我得到的只是0(或者什么也没有,我想)。这是我第一次使用API调用,所以我不知道我做错了什么。我已经证实我有正确的句柄,有一个闯入的VS。

(如果这些比例太差,我很抱歉。很难根据比例4k来判断)

与Spy++相比

所以,我已经确认我有正确的hWnd句柄,但是当我调用一个GetClientRect()时,我什么也得不到。

以下是相关代码:

代码语言:javascript
复制
Dim rdpWnd As New IntPtr
Dim proc As New Process

Private Declare Auto Function GetClientRect Lib "user32.dll" ( _
    ByVal hWnd As IntPtr, ByVal lpRect As RECT) As Boolean

<StructLayout(LayoutKind.Sequential)>
Private Structure RECT
    Private Left As Short
    Private Top As Short
    Private Right As Short
    Private Bottom As Short
End Structure

Private Sub Form_Load( _
    sender As Object, e As EventArgs) Handles MyBase.Load

    Dim startInfo As New ProcessStartInfo With {
        .FileName = """" & appPath & "\console\wfreerdp.exe""",
        .Arguments = "/parent-window:" & SplitContainer2.Panel1.Handle.ToString() & " /t:" & vmId
    }
    proc = Process.Start(startInfo)

    rdpWnd = getWindowHandle(Me.Text, vmId)
End Sub

Private Function getWindowHandle(caption As String, Guid As String) As IntPtr

    Dim hWnd As IntPtr = FindWindow(Nothing, caption)
    If hWnd.Equals(IntPtr.Zero) Then
        Return Nothing
    End If

    .......

    Dim hWndRdp As IntPtr = FindWindowEx(hWndChild4, IntPtr.Zero, Nothing, Guid)
    If hWndRdp.Equals(IntPtr.Zero) Then
        Return Nothing
    End If

    Return hWndRdp
End Function

此时,我正在以我的形式查看Hyper的控制台窗口,但当我单击谚语中的Button1.

代码语言:javascript
复制
Private Sub Button1_MouseClick( _
    sender As Object, e As MouseEventArgs) Handles Button1.MouseClick

    Dim myRect As New RECT
    GetClientRect(rdpWnd, myRect)
    Dim rdpWndWidth As Short = myRect.Right - myRect.Left
    Dim rdpWndHeight As Short = myRect.Bottom - myRect.Top
    MsgBox("Width: " & rdpWndWidth & vbCrLf & 
           "Height: " & rdpWndHeight)
End Sub

MsgBox()返回:

VS中的变量:

我做错了什么?当我清楚地看到Spy++可以的时候,为什么我不能得到客户端的大小呢?我花了很多时间想办法解决这个问题,我希望能在这个里程碑上得到帮助。如果我不能尽快拿到的话,我马上就要搬到别的地方来了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-11 05:06:55

您正在按值将RECT结构传递给GetClientRect。这将创建结构的副本。因此,原始RECT值从未被方法调用修改过,因此它的所有字段都有默认值(即零)。

将方法签名更改为

代码语言:javascript
复制
Private Declare Auto Function GetClientRect Lib "user32.dll" ( _
    ByVal hWnd As IntPtr, ByRef lpRect As RECT) As Boolean

(注意ByRef关键字)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43906593

复制
相关文章

相似问题

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