PostMessage UDF

06/04/2011 03:46 Whoknowsit#16
Hallo Killer,

sieht gut aus, aber ich glaube, ich bin zu blöd :D

Ich möchte folgendes an $_handle senden:

Code:
/w xyz hallo
Wie genau muss ich mit deiner UDF vorgehen, um das zu erreichen? Ferner funktioniert das nicht:

Code:
_PostMessage_Send($_handle, "{DOWN}")
Wäre dir über Hilfe dankbar.

Im Übrigen geht es um ein inaktives WoW-Fenster. Bin mir ja nichtmal sicher, ob das Ganze dort überhaupt funktioniert.
06/04/2011 10:09 BlackHybrid#17
Machs doch einfach mit ControlSend oder gehts damit nichtmehr seit Cata drausen ist?
06/04/2011 11:01 Whoknowsit#18
[Only registered and activated users can see links. Click Here To Register...]
06/04/2011 15:21 KDeluxe#19
Quote:
Originally Posted by Whoknowsit View Post
Ich möchte folgendes an $_handle senden:

Code:
/w xyz hallo
"/" kannst du mit dieser UDF nicht senden.
06/04/2011 15:33 Whoknowsit#20
Okay, danke. Dann sollen die mal ControlSend heile machen, damit da nicht ständig irgendwas verloren geht :D
06/04/2011 21:19 | Moep |#21
Habs jetzt nicht getestet, aber sollte funzen.


Code:
#include <WindowsConstants.au3>

Opt("WinTitleMatchMode", 3)

Global $client = "Neues Textdokument - Editor"
Global $hwnd = WinGetHandle($client)

KeySend("SLASH")
KeySend("w")
KeySend("SPACE")
KeySend("x")
KeySend("y")
KeySend("z")
KeySend("SPACE")
KeySend("H")
KeySend("a")
KeySend("l")
KeySend("l")
KeySend("o")


; send single keyboard event to non active window
; event = pressed, down, up
; kdown = key down delay
; note: supports only lower case keys + NUMx, Fx, some special keys and @
Func KeySend($inkey, $evt ="pressed", $kdown = 50)
	$user32 = DllOpen("user32.dll")
	if $user32 = -1 Then
		ConsoleWrite("KeySend: cannot open user32.dll")
		Exit
	EndIf
		
    ; handling for special keys
	Switch StringUpper($inkey)
	Case "@"
		$skey = 0x40
		$lparam = 0x00100001
		DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $WM_KEYDOWN, "int", 0x71, "long", $lparam)
		DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $WM_CHAR, "int", $skey, "long", $lparam)
		Sleep(20)
		DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $WM_KEYUP, "int", 0x71, "long", BitOR($lparam, 0xC0000000))		
	Case "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12"
		$skey = 0x6f + Int(StringMid($inkey, 2)) 
		ContinueCase
	Case "NUM0", "NUM1", "NUM2", "NUM3", "NUM4", "NUM5", "NUM6", "NUM7", "NUM8" , "NUM9"
		if StringUpper(StringLeft($inkey, 3)) = "NUM" Then
			$skey = 0x60 + Int(StringMid($inkey, 4)) 
		EndIf
		ContinueCase
	Case "RETURN", "SPACE", "TAB", "BACK", "END", "HOME", "SNAPSHOT", "INSERT", "DELETE","SLASH", "LEFT", "RIGHT", "UP", "DOWN"
		Switch StringUpper($inkey)
		Case "RETURN"
			$skey = 0x0D
		Case "SPACE"
			$skey = 0x20
		Case "TAB"
			$skey = 0x09
		Case "BACK"
			$skey = 0x08
		Case "END"
			$skey = 0x23
		Case "HOME"
			$skey = 0x24
		Case "SNAPSHOT"
			$skey = 0x2c
		Case "INSERT"
			$skey = 0x2d
		Case "DELETE"
			$skey = 0x2e
		Case "SLASH"
			$skey = 0x2f	
		Case "LEFT"
			$skey = 0x25
		Case "RIGHT"
			$skey = 0x27
		Case "UP"
			$skey = 0x26
		Case "DOWN"
			$skey = 0x28
		EndSwitch
		$ret = DllCall($user32, "int", "MapVirtualKey", "int", $skey, "int", 0)
		$lparam = BitShift($ret[0], -16)
		$lparam = BitOr($lparam, 1)
		DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $WM_KEYDOWN, "int", $skey, "long", $lparam)
		Sleep($kdown)
		DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $WM_KEYUP, "int", $skey, "long",   BitOR($lparam, 0xC0000000))
	Case Else ; default lower case key handling
		$key = DllCall($user32, "int", "VkKeyScan", "int", Asc(StringLower($inkey)))
		$skey = $key[0]		
		$ret = DllCall($user32, "int", "MapVirtualKey", "int", $skey, "int", 0)
		$lparam = BitShift($ret[0], -16)
		$lparam = BitOr($lparam, 1)
		Select
		Case $evt = "pressed"
			DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $WM_KEYDOWN, "int", $skey, "long", $lparam)
			Sleep($kdown)
			DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $WM_KEYUP, "int", $skey, "long",   BitOR($lparam, 0xC0000000))
		Case $evt = "down"
			DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $WM_KEYDOWN, "int", $skey, "long", $lparam)
		Case $evt = "up"
			DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $WM_KEYUP, "int", $skey, "long",   BitOR($lparam, 0xC0000000))
		EndSelect		
	EndSwitch

	DllClose($user32)
EndFunc
Credits: tonitusch666
06/04/2011 23:27 Whoknowsit#22
Danke, werds morgen mal testen, auch wenn ich befürchte, dass es nicht funktioniert :D
06/05/2011 10:23 | Moep |#23
Was für ein OS benutz du? Bei meinem w7 x64 funktioniert es z.b. nicht. Jedoch bin ich mir sicher dass es bei meinem alten xp x86 ordentlich funktioniert hat.

Ansonsten kannst du mal bei killerdeluxe seiner udf bei $key den ascii code vom slash probieren. Also:

Code:
_PostMessage_Send($hWnd, 0x2f, $Delay = 10)
Kann das Archiv leider nicht runterladen sonst hätt ichs mir mal angeschaut.
02/22/2012 16:36 KDeluxe#24
Ich hab nach langem mal wieder etwas geändert. Die [Only registered and activated users can see links. Click Here To Register...] können nur als $Key Parameter angegeben werden. Außerdem habe ich einen Bug gefixt, wodurch es nicht mehr möglich war Zahlen und Buchstaben zu senden.
02/22/2012 20:18 EliteDeath#25
Hey :D
es fehlt die declaration von den Variablen $VK_LBUTTON sowie M und R, sodass man eine Fehlermeldung bekommt...

Ich weiß zar, wie man das fixt, aber wär trotzdem nett, wenn du das fixt :P
02/22/2012 22:51 KDeluxe#26
Ich habe die UDF mit der aktuellsten AutoIt Version überarbeitet. In dieser Version sind $VL_LBUTTON, $VK_RBUTTON und $VK_MBUTTON schon in der "Constants.au3" deklariert. Hätte ich vielleicht dazuschreiben können.
Ansonsten sollte man es noch per If Abfrage mit IsDeclared() lösen können. Nichts dramatisches, deswegen werde ich es auch nicht ändern.
02/25/2012 14:16 YunoSubs#27
Hast du vielleicht ein Beispiel da, ich verstehe es leider nicht ganz.

Code:
$hWnd = WinGetHandle("PostMessage UDF - Seite 3 - Mozilla Firefox") ;
_PostMessage_Send($hWnd, "{F5}",1500)
02/25/2012 18:58 EliteDeath#28
Hey KD,
ich versuche bei LC nen kleinen Pixelbot mit deiner UDFzu schreiben, bekomme aber imm send error... kann man den beheben oder sind jetzt alle Bots gestorben?
ED
02/25/2012 19:56 omer36#29
Quote:
Originally Posted by EliteDeath View Post
Hey KD,
ich versuche bei LC nen kleinen Pixelbot mit deiner UDFzu schreiben, bekomme aber imm send error... kann man den beheben oder sind jetzt alle Bots gestorben?
ED
Ich glaube kaum, dass KD hellsehen kann..
error posten und abwarten...
02/25/2012 20:25 KDeluxe#30
Wieso werden hier nicht themenrelevante Probleme angesprochen? Irgendwelche Fehler bei Spiel XYZ sind mir egal, hier geht es rein um die PostMessage Funktion.