移动表单不起作用

时间:2014-11-20 11:26:41

标签: vb.net

一旦定时器被调用,我想移动我的无边框形式,但是,它没有做任何事情。它也没有给出错误。它什么都不做......希望有人可以提供帮助。

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    Debug.WriteLine("Timer has ticked. " & TimeOfDay)
    Try
        If Screen.AllScreens.Length = 2 Then
            Debug.WriteLine("Screen is connected!")

            Me.Location = New Point(Screen.AllScreens(1).Bounds.X, Screen.AllScreens(1).Bounds.Y)

        Else
            Debug.WriteLine("Screen is not connected!")
        End If
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub

1 个答案:

答案 0 :(得分:0)

使用此:

    If Screen.AllScreens.Length > 1 Then
        ' To make it work with more than 2 screens (never tried though)
        Dim SecondaryScreenIndex As Int32 = -1

        ' Find Secondary Screen...
        ' Because it happens AllScreens(0) is not always PrimaryScreen..?
        For i As Int32 = 0 To Screen.AllScreens.Length - 1
            If Screen.AllScreens(i) IsNot Screen.PrimaryScreen Then
                SecondaryScreenIndex = i
                Exit For
            End If
        Next

        If SecondaryScreenIndex > -1 Then
            Debug.WriteLine("Screen is connected!")
            Me.Location = New Point( _
                Screen.AllScreens(SecondaryScreenIndex ).Bounds.Left, _
                Screen.AllScreens(SecondaryScreenIndex ).Bounds.Top)
            ' Try Left and Top if it makes any difference.
        Else
            Debug.WriteLine("Screen is not connected!")
        End If
    End If

  

以下是可选的

  

(或垃圾)

我建议您创建一个类,如Screen_ClassScreenTools,其中包含以下内容,如果您计划加载更多表单,则会处理对可用屏幕的监视/检查...

' ...

Public Shared Event ScreensChanged() ' <- capture this event..
Private Shared ps_ScreensMonitor As System.Windows.Forms.Timer = Nothing
Private Shared ps_MonitorCount As Int32 = 0
Private Shared ps_PrimaryScreenIndex As Int32 = 0

Public Shared Sub BeginScreensMonitoring()
    If ps_ScreensMonitor Is Nothing Then
        ps_ScreensMonitor = New System.Windows.Forms.Timer()
        ps_ScreensMonitor.Interval = 500
        AddHandler ps_ScreensMonitor.Tick, AddressOf HandleScreensMonitoring
    End If
    If Not ps_ScreensMonitor.Enabled Then
        ps_ScreensMonitor.Enabled = True
    End If
End Sub

Public Shared Sub SuspendScreensMonitoring()
    If ps_ScreensMonitor IsNot Nothing Then
        ps_ScreensMonitor.Enabled = False
        RemoveHandler ps_ScreensMonitor.Tick, AddressOf HandleScreensMonitoring
        ps_ScreensMonitor.Dispose()
        ps_ScreensMonitor = Nothing
    End If
End Sub

Private Shared Sub HandleScreensMonitoring(sender As Object, e As System.EventArgs)
    Dim i As Int32
    Dim AnythingChanged As Boolean = False

    ' Locate PrimaryScreen...
    For i = 0 To Screen.AllScreens.Length - 1
        If Screen.AllScreens(i) Is Screen.PrimaryScreen Then
            If ps_PrimaryScreenIndex <> i Then
                ps_PrimaryScreenIndex = i
                AnythingChanged = True
            End If
            Exit For
        End If
    Next

    ' Find if a screen has been connected or disconnected
    If ps_MonitorCount <> Screen.AllScreens.Length Then
        ps_MonitorCount = Screen.AllScreens.Length
        AnythingChanged = True
    End If

    ' Fire the event to notify the changes.
    If AnythingChanged Then
        RaiseEvent ScreensChanged
    End If
End Sub

' WARNING !!! THIS IS NOT THREAD SAFE !

然后从主Form构造函数或Loading:

启动监控
    ' ...
    Screen_Class.BeginScreensMonitoring()
    AddHandler Screen_Class.ScreensChanged, AddressOf HandleScreensUpdate
    ' ...

Private Sub HandleScreensUpdate()
    ' Do here whatever you want here...

    ' Get the index of the PrimaryScreen for example, 
    ' (^^ you can also make a static ReadOnly PrimaryScreenIndex Property 
    ' in the custom class above and even add a 
    ' Static ReadOnly SecondaryScreenIndex if you want)
End Sub

然后,您可以根据您在此自定义类上提供的成员来控制任何表单的加载。使此方法可用于您的要求取决于您如何使用表单...