Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 当windows窗体不可见时,屏幕捕获不起作用_.net_Vb.net - Fatal编程技术网

.net 当windows窗体不可见时,屏幕捕获不起作用

.net 当windows窗体不可见时,屏幕捕获不起作用,.net,vb.net,.net,Vb.net,当我运行窗体时,以下程序不会捕获屏幕。计时器在窗体加载事件中启动 有没有办法让这个程序在窗体不可见模式下捕获屏幕。请帮我解决这个问题。谢谢 Private keepInvisible As Boolean Public Sub New() InitializeComponent() keepInvisible = True End Sub Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Ti

当我运行窗体时,以下程序不会捕获屏幕。计时器在窗体加载事件中启动

有没有办法让这个程序在窗体不可见模式下捕获屏幕。请帮我解决这个问题。谢谢

Private keepInvisible As Boolean

Public Sub New()

    InitializeComponent()
    keepInvisible = True
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    keepInvisible = False


    Dim ScreenSize As Size = New Size(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
    Dim screenGrab As New Bitmap(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
    Using g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(screenGrab)
        g.CopyFromScreen(New Point(0, 0), New Point(0, 0), ScreenSize)
    End Using

    screenGrab = New Bitmap(screenGrab, 800, 600) 'Defines the new image size

    Dim Filename As String
    Filename = Format(Now, "dd-MM-yyyy hh-mm-ss tt") 'I want the date to be the name of the image

    screenGrab.Save(Application.StartupPath & "/" & Filename & ".Jpeg", Imaging.ImageFormat.Jpeg)
End Sub

Protected Overrides Sub SetVisibleCore(ByVal value As Boolean)
    If keepInvisible Then
        MyBase.SetVisibleCore(False)
    Else
        MyBase.SetVisibleCore(value)
    End If
End Sub
计时器在窗体加载事件中启动

这就是提示,加载事件不会触发。因为您重写了SetVisibleCore(),并决定保持窗口不可见。这也可以防止加载事件触发。除非你真的让窗户可见,否则它不会开火。使用调试器很容易诊断,只需在事件处理程序上设置一个断点

只是不要使用Load事件,您根本不需要它。只有当您需要知道表单的实际位置和大小属性时,才需要加载。其他所有内容都需要放在类的构造函数中<在VB.NET应用程序中,代码>子新建。不幸的是,Load是默认事件,这是从VB6继承来的一个怪癖,因此程序员倾向于在其中放入太多的内容。别这样

Public Sub New()
    InitializeComponent()
    Timer1.Enabled = True
End Sub

Protected Overrides Sub SetVisibleCore(value As Boolean)
    If Not Me.IsHandleCreated Then
        value = False
        CreateHandle()
    End If
    MyBase.SetVisibleCore(value)
End Sub

请注意SetVisibleCore()中的更改,它仍然创建本机窗口,以确保Close()方法执行您期望的操作。

您如何知道它不工作?为什么您使用的是
SetVisibleCore
而不仅仅是Me.Visible?计时器的时间间隔是多少。如果它太小,您可能会在上面写入同一个文件。你也不是在浪费资源。如果它运行一段时间,你会得到一个GDI例外。隐藏它不会使窗体不可见。我尝试过不使用SetVisibleCore,最初效果很好,但之后我只添加了SetVisibleCore,现在表单不可见,但屏幕捕获不起作用您在某处有其他问题,因为
Me.Visible
Me.Hide
应始终使表单不可见我手头有代码,并与我一起在计时器上使用它。Visible和它可以很好地保存文件…我确实调整了名称,使其差异超过了1秒。谢谢Hans,我调用了timer.start from sub new()并成功了。