|
You last visited: Today at 13:43
Advertisement
keine reaktion auf Postmessage
Discussion on keine reaktion auf Postmessage within the Guild Wars forum part of the MMORPGs category.
03/02/2009, 08:13
|
#1
|
elite*gold: 0
Join Date: Mar 2009
Posts: 33
Received Thanks: 1
|
[SOLVED]keine reaktion auf Postmessage
Einen wunderschönen guten Morgen,
ich hoffe nicht das euch das thema zum halse raus hängt, aber leider habe ich nichts passendes in andern Threads gefunden.
Vorabinfo:
Sprache: VB2008
System: WinXP Prof SP2
Mein Problem ist das GW das Postmessage nicht "an nimt"
( Auch Sendmessage geht nicht )
Die sache ist das ich es erreichen will das GW die Skills durch "Tastendruck" ausführen will, den ich durch Postmessage/Sendmessage sende ( Taste 1,2,3,4 .... 8 )
Info:
Wenn ich das Programm mit dem handle vom Editor starte, dann schreibt das programm auch schön alles im Editor auf, aber wie gesagt, sobald es an GW gerichtet ist geht es nicht.
Hier mal der wie ich denke entscheidene Code:
PHP Code:
Private Declare Ansi Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As String) As Integer
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Private Declare Ansi Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const WM_CHAR = &H102
Const WM_KEYDOWN = &H100 : Const WM_KEYUP = &H101
Dim hwnd As Integer = FindWindow(vbNullString, "Guild Wars")
Dim hwn As Integer = FindWindowEx(hwnd, 0, Nothing, vbNullString)
[...]
PostMessage(hwn, WM_KEYDOWN, 49, vbNullString)
PostMessage(hwn, WM_CHAR, 49, vbNullString)
PostMessage(hwn, WM_KEYUP, 49, vbNullString)
' Habe hier verschiedene Sachen versucht
' nur Keydown, keydown und keyup, nur char, wMsg = &H31 ...
' aber nichts hat hingehauen
[...]
wäre nett wenn ihr mir helfen könntet
MFG
|
|
|
03/02/2009, 08:54
|
#2
|
elite*gold: 0
Join Date: Mar 2008
Posts: 374
Received Thanks: 198
|
Moin Moin, das ist normal... du kannst so nur in den Chat schreiben!
Weil games wie wir denke ich mal wissen, mit dem DirectInput arbeiten...DirectInput liegt 'über' der WindowsApi und fängt alle Eingabe Event's ab..Du kannst es höchstens mit sendinput versuchen.
|
|
|
03/02/2009, 09:49
|
#3
|
elite*gold: 0
Join Date: Mar 2009
Posts: 33
Received Thanks: 1
|
danke für die schnelle Antwort,
ich werde das mal ausprobieren, mal sehen ob das was wird 
ansonsten schreib ich nochmal
MFG
|
|
|
03/02/2009, 19:27
|
#4
|
elite*gold: 0
Join Date: Mar 2009
Posts: 33
Received Thanks: 1
|

.... hmmm jetzt habe ich es zwar geschaft den tastenanschlag an gw zu schicken, ABER
es geht nur im chat, sprich die skills werden nicht ausgeführt .... *cry*
mein code ist ziemlich an diesem "tut" angepasst:

wüste jemand rat?,
oder sind das zu wenig infos ?
|
|
|
03/02/2009, 19:52
|
#5
|
elite*gold: 0
Join Date: Nov 2008
Posts: 576
Received Thanks: 191
|
soweit mirs erklärt wurde und ich es hoffe einigermasen richtig verstanden habe, sind das zwei unterschiedliche sachen.
postmessage ist ein befehl für textverarbeitung, und skills casten, etc. sind user verarbeitungen.
schau dir mal den tt6 code an, da wurde es gelöst.
|
|
|
03/02/2009, 21:10
|
#6
|
elite*gold: 0
Join Date: Mar 2009
Posts: 33
Received Thanks: 1
|
hmmm, wenn ich das richtig gesehen habe, dann haben die bei tt6 einfach ein befehl namens KeySend(...)
den kann ich ja nicht so in vb übernehmen.
habe auch das ganze bei mir auch nochmal mit zb
SendKeys.Send("{UP}") ausprobiert,
oder SendKeys.Send("1"), aber da hängt sich gw auf, bzw freezed.
und auf autoit wollte ich jetzt eigentlich nicht umsteigen.
|
|
|
03/02/2009, 21:20
|
#7
|
elite*gold: 0
Join Date: Nov 2008
Posts: 576
Received Thanks: 191
|
Quote:
Originally Posted by xachimx
hmmm, wenn ich das richtig gesehen habe, dann haben die bei tt6 einfach ein befehl namens KeySend(...)
den kann ich ja nicht so in vb übernehmen.
habe auch das ganze bei mir auch nochmal mit zb
SendKeys.Send("{UP}") ausprobiert,
oder SendKeys.Send("1"), aber da hängt sich gw auf, bzw freezed.
und auf autoit wollte ich jetzt eigentlich nicht umsteigen.
|
löl..
musst dir auch anschauen, wie er die funktion aufgebaut hat.
hab auch keine ahnung aus was sich in vb die funktion SendKeys.Send("{UP}") zusammensetzt.
postmessage msdn??? nicht nur copy & pase :P bitte.
|
|
|
03/02/2009, 21:31
|
#8
|
elite*gold: 0
Join Date: Apr 2008
Posts: 1,874
Received Thanks: 213
|
Seh ich das richtig? Mit diesem PostMessage kann man etwas vollständig in den Chat schrieben? Wenn mans in Au3 scripts einbinden kann wäre bestimmt geil für eine Resign Func...
|
|
|
03/02/2009, 21:35
|
#9
|
elite*gold: 0
Join Date: Aug 2006
Posts: 515
Received Thanks: 95
|
OMQ, was ist wohl in der TT6 enthalten? Eine Resign - Funktion!
|
|
|
03/02/2009, 22:05
|
#10
|
elite*gold: 0
Join Date: Mar 2009
Posts: 33
Received Thanks: 1
|
@__wadim
die funktion sendkeys.send(...) ist eine in vb integrierte funktion, falls du das meinst
und postmessage und sendmessage und sendinput habe ich ja auch schon ausprobiert
und ich mach nicht nur copy & paste, ich denke mir auch was dabei was ich da mache.
die sache ist halt das bei sendkey gw freezed, und sendinput nur im chat schreibt, alles andere geht garnicht, jedenfalls bei mir nicht.
weis denn jemand wie das in autoit umgesetzt wird ?
|
|
|
03/02/2009, 22:24
|
#11
|
elite*gold: 0
Join Date: Feb 2008
Posts: 147
Received Thanks: 184
|
hiho,
also weil ich autoit nich so ganz toll find  hab ich die komplette tt6 1.4 nach VB.net portiert, inklusive einer PixelChecksum in einer low level c++ dll und ReadMems (btw .ini handling hab ich über nini.dll gelöst), ABER weil ich net so viel Zeit hab, ist das alles noch ungetestet und weis auch nicht ob ich das public machen will (die meisten hier nutzen ja autoit). Aber zumindest für Dein Problem sollten folgende Codeschnipsel weiterhelfen...
Code:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As UInteger
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As UInteger, ByVal uMsg As UInteger, ByVal wParam As UInteger, ByVal lParam As UInteger) As UInteger
Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As UInteger, ByVal wMapType As UInteger) As UInteger
Private Declare Function VkKeyScan Lib "user32" Alias "VkKeyScanA" (ByVal cChar_Renamed As Byte) As Short
'get process and window infos
pid = GetPID(name)
hwnd = FindWindow(Nothing, name)
Private Function GetPID(ByVal name As String) As UInteger
Dim proc As Process
Dim procs() As Process
Dim pid As UInteger
procs = Process.GetProcesses()
For Each proc In procs
If proc.MainWindowTitle = name Then
pid = proc.Id
End If
Next
Return pid
End Function
' 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 @
Public Sub KeySend(ByVal inkey As String, Optional ByVal evt As String = "pressed", Optional ByVal kdown As UInteger = 50)
Dim skey, lparam, ret As UInteger
Const WM_KEYDOWN As UInteger = &H100
Const WM_KEYUP As UInteger = &H101
Const WM_CHAR As UInteger = &H102
Const FLAG As UInteger = &HC0000000UI
'handling for special keys
Select Case inkey.ToUpper
Case "@"
skey = &H40
lparam = &H100001
PostMessage(hwnd, WM_KEYDOWN, &H71, lparam)
PostMessage(hwnd, WM_CHAR, skey, lparam)
Thread.Sleep(20)
PostMessage(hwnd, WM_KEYUP, &H71, lparam Or FLAG)
Case "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12"
skey = &H6F + UInteger.Parse(inkey.Substring(1))
ret = MapVirtualKey(skey, 0)
lparam = (ret << 16) Or &H1
PostMessage(hwnd, WM_KEYDOWN, skey, lparam)
Thread.Sleep(kdown)
PostMessage(hwnd, WM_KEYUP, skey, lparam Or FLAG)
Case "NUM0", "NUM1", "NUM2", "NUM3", "NUM4", "NUM5", "NUM6", "NUM7", "NUM8", "NUM9"
skey = &H60 + UInteger.Parse(inkey.Substring(3))
ret = MapVirtualKey(skey, 0)
lparam = (ret << 16) Or &H1
PostMessage(hwnd, WM_KEYDOWN, skey, lparam)
Thread.Sleep(kdown)
PostMessage(hwnd, WM_KEYUP, skey, lparam Or FLAG)
Case "RETURN", "SPACE", "TAB", "BACK", "END", "HOME", "SNAPSHOT", "INSERT", "DELETE", "LEFT", "RIGHT", "UP", "DOWN"
Select Case inkey.ToUpper
Case "RETURN"
skey = &HD
Case "SPACE"
skey = &H20
Case "TAB"
skey = &H9
Case "BACK"
skey = &H8
Case "END"
skey = &H23
Case "HOME"
skey = &H24
Case "SNAPSHOT"
skey = &H2C
Case "INSERT"
skey = &H2D
Case "DELETE"
skey = &H2E
Case "LEFT"
skey = &H25
Case "RIGHT"
skey = &H27
Case "UP"
skey = &H26
Case "DOWN"
skey = &H28
End Select
ret = MapVirtualKey(skey, 0)
lparam = (ret << 16) Or &H1
PostMessage(hwnd, WM_KEYDOWN, skey, lparam)
Thread.Sleep(kdown)
PostMessage(hwnd, WM_KEYUP, skey, lparam Or FLAG)
Case Else 'default lower case key handling
skey = VkKeyScan(Asc(inkey))
ret = MapVirtualKey(skey, 0)
lparam = (ret << 16) Or &H1
Select Case evt
Case "pressed"
PostMessage(hwnd, WM_KEYDOWN, skey, lparam)
Thread.Sleep(kdown)
PostMessage(hwnd, WM_KEYUP, skey, lparam Or FLAG)
Case "down"
PostMessage(hwnd, WM_KEYDOWN, skey, lparam)
Case "up"
PostMessage(hwnd, WM_KEYUP, skey, lparam Or FLAG)
End Select
End Select
End Sub
weis jetzt nicht obs schon vollständig ist, sollte aber so in etwa zum laufen zu bringen sein ...
mfg
|
|
|
03/02/2009, 22:32
|
#12
|
elite*gold: 0
Join Date: Nov 2008
Posts: 576
Received Thanks: 191
|
tonitusch da ihr hier gerade mal dabei seid, hab ich auch ne frage. bis jetzt nutz ich bei meinen bots autoitx.dll und controlsend fürs skill casten. würde aber gerne nun mit postmessage machen. hättest du da ein beispiel in cpp für mich?
|
|
|
03/02/2009, 23:08
|
#13
|
elite*gold: 0
Join Date: Feb 2008
Posts: 147
Received Thanks: 184
|
leider nicht fertig rumliegen  aber wenn man windows.h includiert hat man alle win32 calls schon direkt zur Verfügung, also den vb code nach c++ zu portieren sollte nicht so das Problem sein, ggf. MSDN spicken
Zu beachten ist natürlich, dass man mit der vereinfachten routine nicht alle chars insb. keine Großbuchstaben schicken kann. Aber btw. gibts den AutoIt 3.1.0 source zum runterladen und rumstöbern...
|
|
|
03/02/2009, 23:18
|
#14
|
elite*gold: 0
Join Date: Mar 2009
Posts: 33
Received Thanks: 1
|
thx tonitusch,
aber kannst du mir sagen wieso vb mir eine divided bx 0 exception wirft wenn das prog hier hin kommt: ret = MapVirtualKey(skey, 0) ( dieses beispiel ist bei den normalen tasten )
und denn noch eine andere frage,
warum/wofür brauch ich die process id ?
|
|
|
03/03/2009, 15:06
|
#15
|
elite*gold: 0
Join Date: Dec 2007
Posts: 680
Received Thanks: 141
|
Quote:
Originally Posted by tonitusch666
hiho,
also weil ich autoit nich so ganz toll find  hab ich die komplette tt6 1.4 nach VB.net portiert, inklusive einer PixelChecksum in einer low level c++ dll und ReadMems (btw .ini handling hab ich über nini.dll gelöst), ABER weil ich net so viel Zeit hab, ist das alles noch ungetestet und weis auch nicht ob ich das public machen will (die meisten hier nutzen ja autoit). Aber zumindest für Dein Problem sollten folgende Codeschnipsel weiterhelfen...
Code:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As UInteger
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As UInteger, ByVal uMsg As UInteger, ByVal wParam As UInteger, ByVal lParam As UInteger) As UInteger
Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As UInteger, ByVal wMapType As UInteger) As UInteger
Private Declare Function VkKeyScan Lib "user32" Alias "VkKeyScanA" (ByVal cChar_Renamed As Byte) As Short
'get process and window infos
pid = GetPID(name)
hwnd = FindWindow(Nothing, name)
Private Function GetPID(ByVal name As String) As UInteger
Dim proc As Process
Dim procs() As Process
Dim pid As UInteger
procs = Process.GetProcesses()
For Each proc In procs
If proc.MainWindowTitle = name Then
pid = proc.Id
End If
Next
Return pid
End Function
' 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 @
Public Sub KeySend(ByVal inkey As String, Optional ByVal evt As String = "pressed", Optional ByVal kdown As UInteger = 50)
Dim skey, lparam, ret As UInteger
Const WM_KEYDOWN As UInteger = &H100
Const WM_KEYUP As UInteger = &H101
Const WM_CHAR As UInteger = &H102
Const FLAG As UInteger = &HC0000000UI
'handling for special keys
Select Case inkey.ToUpper
Case "@"
skey = &H40
lparam = &H100001
PostMessage(hwnd, WM_KEYDOWN, &H71, lparam)
PostMessage(hwnd, WM_CHAR, skey, lparam)
Thread.Sleep(20)
PostMessage(hwnd, WM_KEYUP, &H71, lparam Or FLAG)
Case "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12"
skey = &H6F + UInteger.Parse(inkey.Substring(1))
ret = MapVirtualKey(skey, 0)
lparam = (ret << 16) Or &H1
PostMessage(hwnd, WM_KEYDOWN, skey, lparam)
Thread.Sleep(kdown)
PostMessage(hwnd, WM_KEYUP, skey, lparam Or FLAG)
Case "NUM0", "NUM1", "NUM2", "NUM3", "NUM4", "NUM5", "NUM6", "NUM7", "NUM8", "NUM9"
skey = &H60 + UInteger.Parse(inkey.Substring(3))
ret = MapVirtualKey(skey, 0)
lparam = (ret << 16) Or &H1
PostMessage(hwnd, WM_KEYDOWN, skey, lparam)
Thread.Sleep(kdown)
PostMessage(hwnd, WM_KEYUP, skey, lparam Or FLAG)
Case "RETURN", "SPACE", "TAB", "BACK", "END", "HOME", "SNAPSHOT", "INSERT", "DELETE", "LEFT", "RIGHT", "UP", "DOWN"
Select Case inkey.ToUpper
Case "RETURN"
skey = &HD
Case "SPACE"
skey = &H20
Case "TAB"
skey = &H9
Case "BACK"
skey = &H8
Case "END"
skey = &H23
Case "HOME"
skey = &H24
Case "SNAPSHOT"
skey = &H2C
Case "INSERT"
skey = &H2D
Case "DELETE"
skey = &H2E
Case "LEFT"
skey = &H25
Case "RIGHT"
skey = &H27
Case "UP"
skey = &H26
Case "DOWN"
skey = &H28
End Select
ret = MapVirtualKey(skey, 0)
lparam = (ret << 16) Or &H1
PostMessage(hwnd, WM_KEYDOWN, skey, lparam)
Thread.Sleep(kdown)
PostMessage(hwnd, WM_KEYUP, skey, lparam Or FLAG)
Case Else 'default lower case key handling
skey = VkKeyScan(Asc(inkey))
ret = MapVirtualKey(skey, 0)
lparam = (ret << 16) Or &H1
Select Case evt
Case "pressed"
PostMessage(hwnd, WM_KEYDOWN, skey, lparam)
Thread.Sleep(kdown)
PostMessage(hwnd, WM_KEYUP, skey, lparam Or FLAG)
Case "down"
PostMessage(hwnd, WM_KEYDOWN, skey, lparam)
Case "up"
PostMessage(hwnd, WM_KEYUP, skey, lparam Or FLAG)
End Select
End Select
End Sub
weis jetzt nicht obs schon vollständig ist, sollte aber so in etwa zum laufen zu bringen sein ...
mfg
|
hmm... also ich finde vb / vb.net voll fürn arsch ...
macht es nicht sinn es in c++ zu transformieren?
|
|
|
 |
|
Similar Threads
|
PostMessage UDF
06/27/2017 - AutoIt - 48 Replies
Benötigt wird mindestens AutoIt v3.3.8.1.
Die UDF beinhaltet 9 Funktionen:
_PostMessage_Send($hWnd, $Key, $Delay = 10)
_PostMessage_SendDown($hWnd, $Key, $Delay = 10)
_PostMessage_SendUp($hWnd, $Key, $Delay = 10)
_PostMessage_Click($hWnd, $X = -1, $Y = -1, $Button = "left", $Clicks = 1, $Delay = 10)
_PostMessage_ClickDown($hWnd, $X = -1, $Y = -1, $Button = "left")
_PostMessage_ClickUp($hWnd, $X = -1, $Y = -1, $Button = "left")
_PostMessage_ClickDrag($hWnd, $X1, $Y1, $X2, $Y2, $Button...
|
[c++]postmessage problem
07/03/2010 - C/C++ - 7 Replies
hi ich hab wieder mal ein problem
ich versuche mit c++ einen bot zu schreiben
und möchte einen tastendruck zum gewünschten fenster senden (nostale) mit postmessage
aber wie??
ich habs mal so probiert
#include <iostream>
#include <windows.h>
|
[TUTORIAL] PostMessage mit AutoIT
06/16/2009 - Flyff Hacks, Bots, Cheats, Exploits & Macros - 0 Replies
Ich habe eine Anfrage bekommen wie man mit AutoIT Tasten und Mausklicks
an ein Flyff Fenster sendet. Ich denke da das mehrere Leute interessieren könnte, poste ich hier meine ausführliche Antwort auf die Frage.
Ob die Assembler Erklärung korrekt ist weiß ich nicht, sollte soweit auch
unwichtig sein.
Ich werde keine weiteren Fragen dazu beantworten.
Die benötigte .dll findet ihr hier:
|
All times are GMT +1. The time now is 13:44.
|
|