Hallo,
meine kleine Anwendung das die erstellung eines Support Ticket erleichtern soll, hat ein kleines Problem. Wenn ein User die windows Skalierung auch nur auf 25% stehen hat, dann zoomt das snippingTool beim aufruf noch einmal weiter rein.
Auf dem Bild nummer 2. Ist die Skalierung in windows ausgeschaltet, also zoomt snippingTool nicht, alles so wie es soll.
Auf dem Bild nummer 3. ist die Skalierung angeschaltet auf 125%, wird nun SnippingTool gestartet, zoomt es noch weiter rein, nicht so wie ich es gerne hätte...
Hier der Code von SnippingTool (x86)
Spoiler anzeigen
der Aufruf erfolgt durch
Hat jemand eine Idee das zu Handeln? Ohne Groß ins System des Users einzugreifen..
EDIT: Hier mal ein kleines Sample Project das funktionniert, auch mit dem zoom^
meine kleine Anwendung das die erstellung eines Support Ticket erleichtern soll, hat ein kleines Problem. Wenn ein User die windows Skalierung auch nur auf 25% stehen hat, dann zoomt das snippingTool beim aufruf noch einmal weiter rein.
Auf dem Bild nummer 2. Ist die Skalierung in windows ausgeschaltet, also zoomt snippingTool nicht, alles so wie es soll.
Auf dem Bild nummer 3. ist die Skalierung angeschaltet auf 125%, wird nun SnippingTool gestartet, zoomt es noch weiter rein, nicht so wie ich es gerne hätte...
Hier der Code von SnippingTool (x86)
VB.NET-Quellcode
- Option Strict On
- Public Class SnippingTool
- Shadows Text As String
- Private Shared _Screen As Screen
- Private Shared BitmapSize As Size
- Private Shared Graph As Graphics
- Private Structure MultiScreenSize
- Dim minX As Integer
- Dim minY As Integer
- Dim maxRight As Integer
- Dim maxBottom As Integer
- End Structure
- Private Shared Function FindMultiScreenSize() As MultiScreenSize
- Dim minX As Integer = Screen.AllScreens(0).Bounds.X
- Dim minY As Integer = Screen.AllScreens(0).Bounds.Y
- Dim maxRight As Integer = Screen.AllScreens(0).Bounds.Right
- Dim maxBottom As Integer = Screen.AllScreens(0).Bounds.Bottom
- For Each aScreen As Screen In Screen.AllScreens
- If aScreen.Bounds.X < minX Then
- minX = aScreen.Bounds.X
- End If
- If aScreen.Bounds.Y < minY Then
- minY = aScreen.Bounds.Y
- End If
- If aScreen.Bounds.Right > maxRight Then
- maxRight = aScreen.Bounds.Right
- End If
- If aScreen.Bounds.Bottom > maxBottom Then
- maxBottom = aScreen.Bounds.Bottom
- End If
- Next
- Dim m_MultiScreenSize As MultiScreenSize
- With m_MultiScreenSize
- .minX = minX
- .minY = minY
- .maxBottom = maxBottom
- .maxRight = maxRight
- End With
- Return m_MultiScreenSize
- End Function
- Public Shared Function Snip() As Image
- Dim m_MultiScreenSize As MultiScreenSize = FindMultiScreenSize()
- Dim bmp As New Bitmap(m_MultiScreenSize.maxRight - m_MultiScreenSize.minX,
- m_MultiScreenSize.maxBottom - m_MultiScreenSize.minY,
- System.Drawing.Imaging.PixelFormat.Format32bppPArgb)
- Dim gr As Graphics = Graphics.FromImage(bmp)
- Graph = gr
- gr.SmoothingMode = Drawing2D.SmoothingMode.None
- BitmapSize = bmp.Size
- Using snipper = New SnippingTool(bmp)
- snipper.Location = New Point(m_MultiScreenSize.minX, m_MultiScreenSize.minY)
- If snipper.ShowDialog() = DialogResult.OK Then
- Return snipper.Image
- End If
- End Using
- Return Nothing
- End Function
- Public Sub New(ByVal screenShot As Image)
- InitializeComponent()
- Me.BackgroundImage = screenShot
- 'Me.BackgroundImageLayout = ImageLayout.None
- Me.ShowInTaskbar = False
- Me.StartPosition = FormStartPosition.Manual
- Me.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center
- Me.DoubleBuffered = True
- End Sub
- Public Property Image() As Image
- Get
- Return m_Image
- End Get
- Set(ByVal value As Image)
- m_Image = value
- End Set
- End Property
- Private m_Image As Image
- Private rcSelect As New Rectangle()
- Private pntStart As Point
- Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
- ''*** Start Snip bei MausDown
- If e.Button <> MouseButtons.Left Then
- Return
- End If
- pntStart = e.Location
- rcSelect = New Rectangle(e.Location, New Size(0, 0))
- Me.Invalidate()
- End Sub
- Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
- ''*** Modiviziere die Selection ***
- If e.Button <> MouseButtons.Left Then
- Return
- End If
- Dim x1 As Integer = Math.Min(e.X, pntStart.X)
- Dim y1 As Integer = Math.Min(e.Y, pntStart.Y)
- Dim x2 As Integer = Math.Max(e.X, pntStart.X)
- Dim y2 As Integer = Math.Max(e.Y, pntStart.Y)
- rcSelect = New Rectangle(x1, y1, x2 - x1, y2 - y1)
- Me.Invalidate()
- End Sub
- Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
- '*** Bild Vervollständigen mit MouseUp ***
- If rcSelect.Width <= 0 OrElse rcSelect.Height <= 0 Then
- Return
- End If
- Image = New Bitmap(rcSelect.Width, rcSelect.Height)
- Using gr As Graphics = Graphics.FromImage(Image)
- gr.DrawImage(Me.BackgroundImage, New Rectangle(0, 0, Image.Width, Image.Height),
- rcSelect, GraphicsUnit.Pixel)
- End Using
- DialogResult = DialogResult.OK
- End Sub
- Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
- '*** Zeichnet die aktuelle auswahl ***'
- Using br As Brush = New SolidBrush(Color.FromArgb(120, Color.White))
- Dim x1 As Integer = rcSelect.X
- Dim x2 As Integer = rcSelect.X + rcSelect.Width
- Dim y1 As Integer = rcSelect.Y
- Dim y2 As Integer = rcSelect.Y + rcSelect.Height
- e.Graphics.FillRectangle(br, New Rectangle(0, 0, x1, Me.Height))
- e.Graphics.FillRectangle(br, New Rectangle(x2, 0, Me.Width - x2, Me.Height))
- e.Graphics.FillRectangle(br, New Rectangle(x1, 0, x2 - x1, y1))
- e.Graphics.FillRectangle(br, New Rectangle(x1, y2, x2 - x1, Me.Height - y2))
- End Using
- '*** Wír zeichnen mit der Maus mit einem 2px Breiten Stift das gwünschte Bild
- Using pen As New Pen(Color.Red, 2)
- e.Graphics.DrawRectangle(pen, rcSelect)
- End Using
- End Sub
- Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
- '*** Erlaubt das abbrechen miit der Escape Taste ***
- If keyData = Keys.Escape Then
- Me.DialogResult = DialogResult.Cancel
- End If
- Return MyBase.ProcessCmdKey(msg, keyData)
- End Function
- Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
- MyBase.OnLoad(e)
- Dim m_MultiScreenSize As MultiScreenSize = FindMultiScreenSize()
- Me.Size = New Size(m_MultiScreenSize.maxRight - m_MultiScreenSize.minX,
- m_MultiScreenSize.maxBottom - m_MultiScreenSize.minY)
- Graph.CopyFromScreen(m_MultiScreenSize.minX, m_MultiScreenSize.minY, 0, 0, BitmapSize)
- End Sub
- Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
- '*** Label nach 5 Sekunden ausblenden ***
- Me.Label1.Text = ""
- Me.Label1.Enabled = False
- End Sub
- End Class
der Aufruf erfolgt durch
Hat jemand eine Idee das zu Handeln? Ohne Groß ins System des Users einzugreifen..
EDIT: Hier mal ein kleines Sample Project das funktionniert, auch mit dem zoom^
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Blackn0va“ ()