Symulacja wciśnięcia prawego klawisza myszy z Shift

0

Witam.
Chcę programowo zrobić tak aby kliknąć Shift + prawy przycisk myszki. Co robię źle? Poniższy kod nie chce działać (Shift się nie naciska a jedynie przycisk myszki):

Dim packed As Long
Dim xcoord As Long
Dim ycoord As Long
xcoord = 731
ycoord = 315

packed = (ycoord * &H10000) + xcoord
Const WM_KEYDOWN As Integer = &H100
Const WM_KEYUP As Integer = &H101
Const VK_SHIFT As Integer = &H10
Const MK_RBUTTON = &H2
Const WM_RBUTTONDOWN = &H204
Const WM_RBUTTONUP = &H205



SendMessage(destination, WM_KEYDOWN, VK_SHIFT, 0)
SendMessage(destination, WM_RBUTTONDOWN, MK_RBUTTON, packed)
SendMessage(destination, WM_RBUTTONUP, 0&, packed)
SendMessage(destination, WM_KEYUP, VK_SHIFT, 0)
0

W Twoim kodzie używasz funkcji SendMessage do symulowania kliknięcia Shift + prawy przycisk myszki. Wygląda na to, że wysyłasz odpowiednie wiadomości, ale w nieprawidłowej kolejności.

Przed kliknięciem prawego przycisku myszki, musisz wysłać wiadomość WM_KEYDOWN z parametrem VK_SHIFT (który reprezentuje naciśnięcie klawisza Shift), a następnie, po kliknięciu przycisku myszy, wysłać wiadomość WM_KEYUP z tym samym parametrem. To pomoże systemowi zrozumieć, że klawisz Shift jest wciąż naciśnięty podczas kliknięcia prawego przycisku myszy.

Poniżej poprawiony kod w języku VB.NET, który powinien działać:

Dim xcoord As Long
Dim ycoord As Long
xcoord = 731
ycoord = 315

packed = (ycoord * &H10000) + xcoord
Const WM_KEYDOWN As Integer = &H100
Const WM_KEYUP As Integer = &H101
Const VK_SHIFT As Integer = &H10
Const MK_RBUTTON = &H2
Const WM_RBUTTONDOWN = &H204
Const WM_RBUTTONUP = &H205

SendMessage(destination, WM_KEYDOWN, VK_SHIFT, 0)
SendMessage(destination, WM_RBUTTONDOWN, MK_RBUTTON, packed)
SendMessage(destination, WM_RBUTTONUP, 0&, packed)
SendMessage(destination, WM_KEYUP, VK_SHIFT, 0)

Zwróć uwagę, że najpierw wysyłamy wiadomość WM_KEYDOWN z parametrem VK_SHIFT, a następnie wysyłamy wiadomość WM_RBUTTONDOWN i WM_RBUTTONUP, a na końcu wysyłamy wiadomość WM_KEYUP z tym samym parametrem VK_SHIFT.

2

Ja reversowałem sporo aplikacji windowsowych i tam jest tak, że jak klikniesz w element gui to jest wysyłany event wm_command i numer, gdzie numer oznacza element gui.

Teraz ty robisz jakąś rzecz powinieneś nagrać jakie elementy zdarzeń wykonujesz w aplikacji.

Przykładowo klikasz coś, najpierwa masz jakieś elementy typu WM_keydown, keyup, potem translatemessage, zmienia to na wm_char i wysyła prawidłowy klawisz.
Najlepiej windows spy++ nagraj i sprawdź jakie eventy są wysyłane, może pomijasz jakiś element, potem sprawdź jak zewnętrznie wysyłasz czy się zgadzają z tymi jakie powinna aplikacja odebrać.

prostytutka, odpisałem nie pod tym tematem :)

0

nie do końca zrozumiałem powyższą wypowiedź, jest jakiś sposób na wysłanie symulacji - shift+PPM do innej aplikacji? może jakoś za pomocą SendInput?

0

a w jakim kolwiek innym języku programowania można wysłać symulację klawiszy np shift + PPM do okna innej aplikacji?

U mnie działa taki kod:

AttachThreadInput( GetCurrentThreadId(), target_thread_id, TRUE );
SetFocus( target_window );
INPUT input[4];
ZeroMemory( &input[0], sizeof(input) );
input[0].type = INPUT_KEYBOARD;
input[0].ki.wVk = VK_SHIFT;
input[1].type = INPUT_MOUSE;
input[1].mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;
input[2].type = INPUT_MOUSE;
input[2].mi.dwFlags = MOUSEEVENTF_RIGHTUP;
input[3].type = INPUT_KEYBOARD;
input[3].ki.wVk = VK_SHIFT;
input[3].ki.dwFlags = KEYEVENTF_KEYUP;
SendInput( sizeof(input) / sizeof( input[0] ), &input[0], sizeof( INPUT ));
AttachThreadInput( GetCurrentThreadId(), target_thread_id, FALSE );

Tylko trzeba mieć identyfikator wątku docelowego i uchwyt okna.

0

ulepiłem taki kod i w zasadzie działa on...jest teraz taki problem że jak okno aplikacji przesunę na krawędź ekranu - to myszka nie chce klikać po za obszar nie widoczny dla oka....a jedynie klika wtedy gdy okno aplikacji jest przesunięte tak , żeby widać było miejsca w które ma klikać myszka

Imports System.Runtime.InteropServices

Public Class Form1
    Const INPUT_MOUSE As UInt32 = 0
    Const INPUT_KEYBOARD As Integer = 1
    Const INPUT_HARDWARE As Integer = 2
    Const XBUTTON1 As UInt32 = &H1
    Const XBUTTON2 As UInt32 = &H2
    Const MOUSEEVENTF_MOVE As UInt32 = &H1
    Const MOUSEEVENTF_LEFTDOWN As UInt32 = &H2
    Const MOUSEEVENTF_LEFTUP As UInt32 = &H4
    Const MOUSEEVENTF_RIGHTDOWN As UInt32 = &H8
    Const MOUSEEVENTF_RIGHTUP As UInt32 = &H10
    Const MOUSEEVENTF_MIDDLEDOWN As UInt32 = &H20
    Const MOUSEEVENTF_MIDDLEUP As UInt32 = &H40
    Const MOUSEEVENTF_XDOWN As UInt32 = &H80
    Const MOUSEEVENTF_XUP As UInt32 = &H100
    Const MOUSEEVENTF_WHEEL As UInt32 = &H800
    Const MOUSEEVENTF_VIRTUALDESK As UInt32 = &H4000
    Const MOUSEEVENTF_ABSOLUTE As UInt32 = &H8000
    Public Const KEYEVENTF_KEYUP = &H2
    Const KEYEVENTF_KEYDOWN As Integer = &H0 ' Press key  
    Public Const VK_SHIFT = &H10

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub
    Public Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Integer) As Integer
    Public Declare Auto Function FindWindow Lib "user32.dll" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
    Public Declare Function IsIconic Lib "user32.dll" (ByVal hwnd As Integer) As Boolean
    Public Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As Integer, ByVal nCmdShow As Integer) As Integer

    Public Const SW_RESTORE As Integer = 9
    Public Const SW_SHOW As Integer = 5


    Sub FocusWindow(ByVal strWindowCaption As String, ByVal strClassName As String)
        Dim hWnd As Integer
        hWnd = FindWindow(strClassName, strWindowCaption)

        If hWnd > 0 Then
            SetForegroundWindow(hWnd)

            If IsIconic(hWnd) Then  'Restore if minimized
                ShowWindow(hWnd, SW_RESTORE)
            Else
                ShowWindow(hWnd, SW_SHOW)
            End If
        End If
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        FocusWindow("Notepad", Nothing)

        'MouseMove(730, 367)
        keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYDOWN, 0)
        MouseRightClick()
        keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0)

        Application.DoEvents()


    End Sub


    Declare Function keybd_event Lib "user32" Alias "keybd_event" _
              (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer,
               ByVal dwExtraInfo As Integer) As Integer


    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
    Public Shared Sub MouseLeftClick()
        Dim it As New INPUT
        it.dwType = INPUT_MOUSE
        it.mkhi.mi.dwFlags = MOUSEEVENTF_LEFTDOWN
        SendInput(1, it, Marshal.SizeOf(it))
        Application.DoEvents()
        it = New INPUT
        it.dwType = INPUT_MOUSE
        it.mkhi.mi.dwFlags = MOUSEEVENTF_LEFTUP
        SendInput(1, it, Marshal.SizeOf(it))
    End Sub


    Public Shared Sub MouseRightClick()
        Dim it As New INPUT
        it.dwType = INPUT_MOUSE
        it.mkhi.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN
        SendInput(1, it, Marshal.SizeOf(it))
        Application.DoEvents()
        it = New INPUT
        it.dwType = INPUT_MOUSE
        it.mkhi.mi.dwFlags = MOUSEEVENTF_RIGHTUP
        SendInput(1, it, Marshal.SizeOf(it))
    End Sub

    Public Shared Sub MouseMove(ByVal x As Integer, ByVal y As Integer)
        Dim fx = x * (65535.0# / (GetSystemMetrics(SystemMetric.SM_CXSCREEN) - 1))
        Dim fy = y * (65535.0# / (GetSystemMetrics(SystemMetric.SM_CYSCREEN) - 1))
        Dim it As New INPUT
        it.dwType = INPUT_MOUSE
        it.mkhi.mi.dwFlags = MOUSEEVENTF_MOVE Or MOUSEEVENTF_ABSOLUTE
        it.mkhi.mi.dx = fx
        it.mkhi.mi.dy = fy
        SendInput(1, it, Marshal.SizeOf(it))
    End Sub

    Private Structure INPUT
        Dim dwType As Integer
        Dim mkhi As MOUSEKEYBDHARDWAREINPUT
    End Structure
    <StructLayout(LayoutKind.Explicit)>
    Private Structure MOUSEKEYBDHARDWAREINPUT
        <FieldOffset(0)> Public mi As MOUSEINPUT
        <FieldOffset(0)> Public ki As KEYBDINPUT
        <FieldOffset(0)> Public hi As HARDWAREINPUT
    End Structure

    Private Structure MOUSEINPUT
        Public dx As Integer
        Public dy As Integer
        Public mouseData As Integer
        Public dwFlags As Integer
        Public time As Integer
        Public dwExtraInfo As Integer
    End Structure

    Private Structure KEYBDINPUT
        Public wVk As Short
        Public wScan As Short
        Public dwFlags As Integer
        Public time As Integer
        Public dwExtraInfo As Integer
    End Structure

    Private Structure HARDWAREINPUT
        Public uMsg As Integer
        Public wParamL As Short
        Public wParamH As Short
    End Structure



    <DllImport("user32.dll")> Private Shared Function GetSystemMetrics(ByVal smIndex As Integer) As Integer
    End Function
    <DllImport("user32.dll")> Private Shared Function SendInput(ByVal nInputs As Integer, ByRef pInputs As INPUT, ByVal cbSize As Integer) As Integer
    End Function

    Public Enum SystemMetric As Integer
        ''' <summary>
        '''  Width of the screen of the primary display monitor in pixels. This is the same values obtained by calling GetDeviceCaps as follows: GetDeviceCaps( hdcPrimaryMonitor HORZRES).
        ''' </summary>
        SM_CXSCREEN = 0
        ''' <summary>
        ''' Height of the screen of the primary display monitor in pixels. This is the same values obtained by calling GetDeviceCaps as follows: GetDeviceCaps( hdcPrimaryMonitor VERTRES).
        ''' </summary>
        SM_CYSCREEN = 1
    End Enum
End Class

1 użytkowników online, w tym zalogowanych: 0, gości: 1