Vb.net 是否通过拖动其他元素在窗体中移动?

Vb.net 是否通过拖动其他元素在窗体中移动?,vb.net,Vb.net,我在VB.NET中制作了一个将DLL注入进程的小程序。这将帮助我学习如何逆向工程和表单设计。唯一的问题是我把表单做成了一个无边界的表单,这意味着我不能拖动它。所以我添加了一个GroupBox元素来覆盖表单大小。我希望能够点击并拖动GroupBox,移动整个表单,就好像它是表单本身,而不是无边界的一样。这听起来可能令人困惑,但这是我目前的代码 Private Sub Loader_Load(ByVal sender As System.Object, ByVal e As System.E

我在VB.NET中制作了一个将DLL注入进程的小程序。这将帮助我学习如何逆向工程和表单设计。唯一的问题是我把表单做成了一个无边界的表单,这意味着我不能拖动它。所以我添加了一个GroupBox元素来覆盖表单大小。我希望能够点击并拖动GroupBox,移动整个表单,就好像它是表单本身,而不是无边界的一样。这听起来可能令人困惑,但这是我目前的代码

    Private Sub Loader_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        DLLs.Name = "DLLs"
        Button1.Text = "Browse"
        Label1.Text = "Waiting for process.exe"
        Timer1.Interval = 50
        Timer1.Start()
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        OpenFileDialog1.Filter = "DLL (*.dll) |*.dll"
        OpenFileDialog1.ShowDialog()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        For i As Integer = (DLLs.SelectedItems.Count - 1) To 0 Step -1
            DLLs.Items.Remove(DLLs.SelectedItems(i))
        Next
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        If IO.File.Exists(OpenFileDialog1.FileName) Then
            Dim TargetProcess As Process() = Process.GetProcessesByName(Textbox1.Text)
            If TargetProcess.Length = 0 Then

                Me.Label1.Text = ("Waiting for process.exe")
            Else
                Timer1.Stop()
                Me.Label1.Text = "Successfully injected"
                Call Inject()
            End If
        Else
        End If
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        Me.Close()
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If IO.File.Exists(OpenFileDialog1.FileName) Then
            Dim TargetProcess As Process() = Process.GetProcessesByName(Textbox1.Text)
            If TargetProcess.Length = 0 Then
                Me.Label1.Text = ("Waiting for process.exe")
            Else
                Timer1.Stop()
                Me.Label1.Text = "Successfully injected"
                Call Inject()
            End If
        Else
        End If
    End Sub

    Private Sub OpenFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
        Dim FileName As String
        FileName = OpenFileDialog1.FileName.Substring(OpenFileDialog1.FileName.LastIndexOf("\"))
        Dim DllFileName As String = FileName.Replace("\", "")
        Me.DLLs.Items.Add(DllFileName)
    End Sub

    Private Sub DLLs_SelectedIndexChanged(sender As Object, e As EventArgs) Handles DLLs.SelectedIndexChanged
        Me.TopMost = True
    End Sub

假设您的groupbox为“GroupBox1”:

Private Sub GroupBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles GroupBox1.MouseDown
    GroupBox1.Capture = False
    Dim msg As Message = Message.Create(Me.Handle, &HA1, 2, 0&)
    Me.DefWndProc(msg)
End Sub

下面是我用来处理类似情况的代码。如果要单击窗体上的任意位置进行拖动,则必须为窗体上的每个控件创建“MouseDown”和“MouseMove”处理程序

Private m_CursorOffset As Point

Public Sub GroupBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles GroupBox1.MouseDown
    If e.Button = Windows.Forms.MouseButtons.Left Then
        m_CursorOffset = e.Location
    End If
End Sub

Public Sub GroupBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles GroupBox1.MouseMove
    If e.Button = Windows.Forms.MouseButtons.Left Then
        'Distance we moved
        Dim d As Point = New Point(e.X - m_CursorOffset.X, e.Y - m_CursorOffset.Y)
        'New location of the form
        Dim adjustedLocation As New Point(Me.Location.X + d.X, Me.Location.Y + d.Y)

        ' Set the new position of our form
        Me.Location = adjustedLocation
    End If
End Sub

请考虑用严格的选项来测试这一点。我从我的几个老项目中得到了这个。IDE建议严格打开,工作正常,这将是:Dim msg As Message=Message.Create(Me.Handle,&HA1,CType(2,IntPtr),CType(0&,IntPtr))抱歉,不确定如何在注释中格式化代码。只需将其放在代码段中它所属的位置。