使用键盘SendKeys捕获活动窗口

时间:2017-09-18 19:50:30

标签: vb.net image keyboard-events

在遇到Visual Basic的打印质量问题后,我决定采用不同的方法。我将模拟ALT-PRINTSCREEN键盘按键以捕获当前状态的表单。

然而,在此之前,我需要从表单中删除某些元素(例如边框),并在获取图像后,我需要替换这些元素。我有一些时间/同步问题,因为我注意到某些元素仍然在已复制到剪贴板的图像上。

我认为这是因为需要时间来处理更改,以及Windows处理模拟"发送密钥的时间,因此我设置了睡眠计时器。我的结果好坏参半。我注意到如果我不替换后面的元素,剪贴板图像就会正确显示。但是,如果我更换它们,即使我设置了20秒的睡眠定时器,它们也不会出现。

因此,我知道存在某种同步问题,但我不知道如何解决它。这是我正在使用的代码:

        'Make these forms invisble so they are not printed
    Logo.Visible = False
    MenuStrip1.Visible = False
    ReportsButton.Visible = False
    pnlmain.BorderStyle = 0 'remove the border

    'Sleep
    System.Threading.Thread.Sleep(1000)

    'simulate an ALT and PRINTSCREEN key click to get ONLY the report
    SendKeys.Send("%{PRTSC}")

    'Sleep
    System.Threading.Thread.Sleep(1000)

    'Now, get the image from the clipboard
    Dim formImage As System.Drawing.Image
    formImage = My.Computer.Clipboard.GetImage()

    Logo.Visible = True
    MenuStrip1.Visible = True
    ReportsButton.Visible = True
    pnlmain.BorderStyle = 1

改变睡眠持续时间似乎没有太大变化(除非它们非常低)。

有什么建议吗?

编辑:这是绘制到位图的代码(在修改上面的代码之后):

formImage = New Bitmap(Me.Width, Me.Height, Me.CreateGraphics())
Me.DrawToBitmap(formImage, New Rectangle(0, 0, Me.Width, Me.Height))

发送到打印操作时:

Dim g As Graphics = e.Graphics

    'transform the form image so it fits the height and width of the paper, with a 5 px margin
    Dim res = printSettings.PrinterResolutions
    Dim newSizeDestinationPoints As Point() = {
        New Point(5, 5),
        New Point(841, 5),
        New Point(5, 956)
    } 'These values are based on A4 sized paper

    'g.DrawImage(formImage, 5, 5)
    g.DrawImage(formImage, newSizeDestinationPoints)

低质量并非来自这段时间。

0 个答案:

没有答案