2017-05-11 16 views
1

VB.NETでVB.NETでWinFormプロジェクトを作成し、SplitContainer2.Panel1FreeRDPというインスタンスを開きます。これはうまく動作しますが、最初にFreeRDPウィンドウに収まるようにフォームを拡大したいと思います。これを行うには、まずFreeRDPインスタンスのサイズを知る必要があります。VB.NET GetClientRect()はWinFormの子プロセスに何も返しません

残念ながら、私が行った試みは何も返しません。私はWindows APIから​​を使用しようとしていますが、私が返すのは0(または何もないと思います)です。私がAPI呼び出しをしたのはこれが初めてのことなので、何が間違っているのか分かりません。私は

はVS

の中断で正しいハンドル持って確認しました(私はこれらの規模が不十分ならば謝罪を。ハードスケール4K上で判断する)

enter image description here

enter image description here

スパイ++に比べて

正しいhWndハンドルがあることを確認しましたが、​​を呼び出すと何も返されません。ここで

は、関連するコードされています、私は自分のフォームでのHyper-V VMのコンソールウィンドウで、この時点で

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 

探していますが、私はことわざのButton1をクリックしたときに...

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()リターン:

enter image description here

とVS内の変数:

enter image description here

私が間違って何をしているのですか? Spy ++ができることが明らかになったときにクライアントのサイズを取得できないのはなぜですか?私はこれを理解しようと多くの時間を費やしてきました。私は、このマイルストーンをチェックオフにする助けに感謝します。私はすぐにそれを得ることができない場合については、別のものに移動し、後で戻ってくる。

+0

どこで 'rdpWnd'を設定しますか? – abto

+0

コードを更新しました。必要に応じて関数全体を投稿することができますが、VSとSpy ++のスクリーンショットから見ることができますが、正しいハンドルがあります。 –

答えて

1

RECT構造体を値GetClientRectに渡しています。これにより、構造体のコピーが作成されます。その結果、元のRECT値はメソッド呼び出しによって決して変更されないので、すべてのフィールドはデフォルト値(つまりゼロ)を持ちます。

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

ByRefキーワードに注意してください)にあなたのメソッドのシグネチャを変更し

+0

さて、私はそれをもっと近くに持ってきて、ありがとう!あなたは正しいが、今は例外がある。返信で画像を投稿する方法はわかりませんが、基本的には「Top」は0、下部は「768」と期待していますが、Top = 3298534884352とBottom = 0が表示されています。そこに何かがない! LOL –

+0

不一致はありますか? –

+1

@ Mako-Wish、あなたはあなたの 'RECT'構造体のフィールドに間違った* type *を使用していることも起こります。それらは 'Short'(' System.Int16')ではなく、 'Integer'(' System.Int32')でなければなりません。 –