Mausklick in fremder Anwendung

19/08/2010 - 22:45 von Martin Speer | Report spam
Hallo NG,

ich muß in einer fremden Anwendung bei Bedarf Mausklicks ausführen lassen,
aber das funktioniert noch nicht so recht und ich habe keine Ahnung warum.
Zum Test habe ich ein kleines Projekt erstellt:

Private Declare Ansi Function SendMessage Lib "user32.dll" Alias
"SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam
As Keys, ByVal lParam As Integer) As Integer
Private Const WM_LBUTTONUP As Long = &H202
Private Const WM_LBUTTONDOWN As Long = &H201

Private Function MakeDWord(ByVal LoWord As Integer, ByVal HiWord As
Integer) As Integer
MakeDWord = (HiWord * &H10000) Or (LoWord And &HFFFF&)
End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click

Dim ClickPos As Integer = MakeDWord(80, 80)
SendMessage(Me.Handle.ToInt32, WM_LBUTTONDOWN, Keys.LButton,
ClickPos)
SendMessage(Me.Handle.ToInt32, WM_LBUTTONUP, Keys.LButton, ClickPos)

End Sub

Im ganzen oberen Bereich der Form habe ich einen Button2 gelegt der bei
Klick eine MSG-Box anzeigt. Ein Klick auf Button1 müßte doch jetzt innerhalb
meines Fensters auf die Koordinaten 80, 80 einen Mausklick auslösen und
damit auch meinen Button2 treffen, oder nicht?

Könnt ihr mir weiterhelfen?

Besten Dank und Grüße,

Martin
 

Lesen sie die antworten

#1 Armin Zingler
20/08/2010 - 00:43 | Warnen spam
Am 19.08.2010 22:45, schrieb Martin Speer:
Hallo NG,

ich muß in einer fremden Anwendung bei Bedarf Mausklicks ausführen lassen,
aber das funktioniert noch nicht so recht und ich habe keine Ahnung warum.
Zum Test habe ich ein kleines Projekt erstellt:




Dass sich falsche Deklarationen immer noch so lange halten. ^^
Versuch's mal hiermit:


Private Declare Ansi Function SendMessage Lib "user32.dll" Alias
"SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam
As Keys, ByVal lParam As Integer) As Integer




Private Declare Ansi Function SendMessage Lib "user32.dll"
(ByVal hwnd As IntPtr, ByVal wMsg As UInteger, ByVal wParam
As UIntPtr, ByVal lParam As IntPtr) As Integer


Private Const WM_LBUTTONUP As Long = &H202
Private Const WM_LBUTTONDOWN As Long = &H201



Private Const WM_LBUTTONUP As UInteger = &H202
Private Const WM_LBUTTONDOWN As UInteger = &H201



Private Function MakeDWord(ByVal LoWord As Integer, ByVal HiWord As
Integer) As Integer
MakeDWord = (HiWord * &H10000) Or (LoWord And &HFFFF&)
End Function



Ich will ja nicht zu viel mosern, aber ich würd's etwas abàndern:

Shared Function MakeInt32(ByVal Lo As Short, ByVal Hi As Short) As Int32
Return CInt(Hi) << 16 Or Lo
End Function


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click

Dim ClickPos As Integer = MakeDWord(80, 80)



Dim ClickPos As Integer = MakeInt32(80, 80)


SendMessage(Me.Handle.ToInt32, WM_LBUTTONDOWN, Keys.LButton,
ClickPos)



Dim wParam As New UIntPtr(CUInt(Keys.LButton))
Dim lParam As New IntPtr(ClickPos)

SendMessage(Me.Handle, WM_LBUTTONDOWN, wParam, lParam)


SendMessage(Me.Handle.ToInt32, WM_LBUTTONUP, Keys.LButton, ClickPos)



SendMessage(Me.Handle, WM_LBUTTONUP, wParam, lParam)


End Sub

Im ganzen oberen Bereich der Form habe ich einen Button2 gelegt der bei
Klick eine MSG-Box anzeigt. Ein Klick auf Button1 müßte doch jetzt innerhalb
meines Fensters auf die Koordinaten 80, 80 einen Mausklick auslösen und
damit auch meinen Button2 treffen, oder nicht?



Versuch's mit neuem Code nochmal. Du hast ein 64-Bit-BS?
Wenn es keinen guten Grund dagegen gibt, würde ich einfach dieselbe
Methode aufrufen, du auch im Button_Click ausgeführt wird statt Mausclicks
zu simulieren.

Außerdem, wolltest du den Mausklick nicht an ein Fenster in einer
_anderen_ Anwendung (s. Betreff) schicken? Mit "Me.Handle" schicktst
du ja an die eigene Form.

Könnt ihr mir weiterhelfen?



HTH


Armin

Ähnliche fragen