VB.NET экран выбора области, как игнорировать центр блокировки мыши для игр, чтобы перемещать мышь туда, куда я хочу - PullRequest
0 голосов
/ 09 июня 2018

Привет, у меня есть небольшая программа, когда вы удерживаете Shift + Control и после перетаскивания мышью рисуете хороший прямоугольник, когда клавиши отпускаются, это отлично работает в окнах и в некоторых играх, даже когда оно полноэкранное :)!

2 Проблема, которую я пытаюсь решить

1) В некоторых играх возьмите мышь и заблокируйте ее в центре. Проблема в том, что вы не можете перемещать мышь туда, куда вам нравится, всегда в центре

я стараюсь вовремя использовать

    Me.Cursor = New Cursor(Cursor.Current.Handle)
    Cursor.Position = New Point(Control.MousePosition.X, Control.MousePosition.Y)

2) некоторые игры игнорируют клавиши control + shift, я пытаюсь поставить что-то вроде control + shift + A, например, но это не работает

GetKeyPress(Keys.ShiftKey) AndAlso GetKeyPress(Keys.ControlKey) AndAlso GetKeyPress(Keys.A)

единственное, что я вижу для работы, это HotKey, но я хочу получить этап, когда Up Down, и я не знаю, как

<Runtime.InteropServices.DllImport("User32.dll")>
Public Shared Function RegisterHotKey(ByVal hwnd As IntPtr,
                                  ByVal id As Integer, ByVal fsModifiers As Integer,
                                  ByVal vk As Integer) As Integer
End Function

здесь полный код, скопируйте, вставьте и запустите его, чтобы сделать ваш тест

Dim timerUpdate As New Timer

Private Const KEY_DOWN As Integer = &H8000
Private Declare Function GetKeyPress Lib "user32" Alias "GetAsyncKeyState" (ByVal key As Integer) As Integer

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'form Setting transparent and hide
    Me.TransparencyKey = Color.Black
    Me.BackColor = Color.Black
    Me.FormBorderStyle = FormBorderStyle.None
    Me.Opacity = 0.0
    Me.TopMost = True
    'Timer
    timerUpdate.Interval = 1
    timerUpdate.Enabled = True
    AddHandler timerUpdate.Tick, AddressOf timerUpdate_Tick
End Sub

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
    'paint rectangle to border red
    Dim size = 2
    Dim RedPen As New Pen(Color.Red, size)
    Dim rect As New Rectangle(size, size, Me.ClientSize.Width - size * 2, Me.ClientSize.Height - size * 2)
    e.Graphics.DrawRectangle(RedPen, rect)
End Sub

Private Sub Form1_Resize(sender As Object, e As EventArgs) Handles MyBase.Resize
    'Refresh for drawing update
    Me.Refresh()
End Sub

Private Sub timerUpdate_Tick(sender As Object, e As EventArgs)
    Dim key_shift As Integer = GetKeyPress(Keys.ShiftKey) AndAlso GetKeyPress(Keys.ControlKey)
    Static key_shift_down As Boolean = False
    Static mousePosKeep As New Point()
    Static mousePosLast As New Point()

    If GetKeyPress(Keys.ShiftKey) AndAlso GetKeyPress(Keys.ControlKey) = KEY_DOWN Then
        If (Not key_shift_down) Then
            'keep mouse position
            mousePosKeep.X = Control.MousePosition.X
            mousePosKeep.Y = Control.MousePosition.Y
            'Move Form to mouse
            Me.Left = mousePosKeep.X
            Me.Top = mousePosKeep.Y
            'Set Key Shift To True
            key_shift_down = True
            'Make Form Vissible
            Me.Opacity = 1.0
            'this help the form to show in game when it's full screen
            'If call again make top the form And you can see it !!! :)
            Me.TopMost = True
            Console.WriteLine("key Shift+Controls Press Down")
        End If
        'Draw rectangle on mouse move

        'Move Size Form Left , Width 
        If (Control.MousePosition.X - mousePosKeep.X) > -1 Then
            Me.Left = mousePosKeep.X
            Me.Width = (Control.MousePosition.X - mousePosKeep.X)
        Else
            Me.Left = Control.MousePosition.X
            Me.Width = (mousePosKeep.X - Control.MousePosition.X)
        End If

        'Move Size Form Top , Height 
        If (Control.MousePosition.Y - mousePosKeep.Y) > -1 Then
            Me.Top = mousePosKeep.Y
            Me.Height = Control.MousePosition.Y - mousePosKeep.Y
        Else
            Me.Top = Control.MousePosition.Y
            Me.Height = mousePosKeep.Y - Control.MousePosition.Y
        End If

        Console.WriteLine("Key Shift+Controls is Down")
    Else
        If key_shift_down = True Then
            'hide form finish when shift up
            Me.Opacity = 0.0
            'nake shift to false
            key_shift_down = False

            'Do your stuff when finish
            '
            '

            Console.WriteLine("Key Shift+Controls Press Up")
        End If


        'Draw Small Point To see where is the mouse when mouse is move
        If (mousePosLast.X <> Control.MousePosition.X And mousePosLast.Y <> Control.MousePosition.Y) Then
            mousePosLast.X = Control.MousePosition.X
            mousePosLast.Y = Control.MousePosition.Y
            Me.Width = 5
            Me.Height = 5
            Me.Opacity = 1.0
            Me.TopMost = True
            Me.Left = Control.MousePosition.X
            Me.Top = Control.MousePosition.Y
            Me.Cursor = Cursors.Cross
            Console.WriteLine("Key Shift+Controls Up")
        Else
            Me.Opacity = 0.0
        End If

    End If

End Sub

спасибо

...