|
You last visited: Today at 12:09
Advertisement
ControlSend zeigt keine Wirkung
Discussion on ControlSend zeigt keine Wirkung within the AutoIt forum part of the Coders Den category.
12/01/2013, 17:31
|
#1
|
elite*gold: 338
Join Date: Aug 2010
Posts: 533
Received Thanks: 201
|
ControlSend zeigt keine Wirkung
Hey.
Wo liegt der Fehler?
Danke im Voraus!
PHP Code:
;Author
#include "KDMemory.au3"
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Pointer.au3>
#Include <GuiListView.au3>
#include <crypt.au3>
#Include <Timers.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 326, 133, 192, 164)
$Button = GUICtrlCreateButton("On", 128, 56, 97, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Dim $handles = 0
Const $processName = "TClient.exe"
While 1
$msg = GUIGetMsg()
If $msg == -3 Then Exit ; $GUI_EVENT_CLOSE
$processId = ProcessExists($processName)
If $processId == 0 Then
If IsArray($handles) Then
_KDMemory_CloseHandles($handles)
$handles = 0
EndIf
ContinueLoop
EndIf
If $handles == 0 Then
$handles = _KDMemory_OpenProcess($processId)
If @error Then
If MsgBox(52, "Error", "Can't open " & $processName & "! @error: " & @error & @CRLF & "Continue?") == 6 Then
$handles = 0
ContinueLoop
Else
Exit
EndIf
EndIf
EndIf
If $msg = $Button Then
ControlSend ("4Story_GSP","","","i")
EndIf
WEnd
|
|
|
12/01/2013, 18:40
|
#2
|
elite*gold: 0
Join Date: Mar 2009
Posts: 7,260
Received Thanks: 33,149
|
Lass mich raten: Einfach alles zusammen kopiert?
GUI Events solltest du zu Beginn der While-Schleife abarbeiten (siehe Bedingung für "Exit").
Code:
#include "KDMemory.au3"
GUICreate("Test", 250, 150)
$Button = GUICtrlCreateButton("Inventar öffnen/schließen", 0, 0, 250, 150)
GUISetState()
Dim $handles = 0
Const $processName = "TClient.exe"
While True
;~ Sleep()
$msg = GUIGetMsg()
Switch $msg
Case -3 ; $GUI_EVENT_CLOSE
Exit
Case $Button
ControlSend ("4Story_GSP", "", "", "i")
EndSwitch
$processId = ProcessExists($processName)
If $processId == 0 Then
If IsArray($handles) Then
_KDMemory_CloseHandles($handles)
$handles = 0
EndIf
ContinueLoop
EndIf
If $handles == 0 Then
$handles = _KDMemory_OpenProcess($processId)
If @error Then
If MsgBox(52, "Error", "Can not open " & $processName & @CRLF & "! @error: " & @error & @CRLF & @CRLF & "Continue?") == 6 Then
$handles = 0
ContinueLoop
Else
Exit
EndIf
EndIf
EndIf
;~ ...
WEnd
Wofür ein Handle zum Lesen und Schreiben erstellen, wenn du es nicht machst? Mehr als ein ControlSend() machst du nicht, dafür brauchst du meine KDMemory.au3 UDF nicht. Da die offiziellen Server einen (schlechten) "Hackshield" verwenden kannst du die Control Befehle nicht verwenden. Den Speicher lesen und schreiben kannst du auch nicht ohne weiteres.
Es ist eigentlich nichts wirklich falsch, dass der Befehl nicht funktioniert liegt schlichtweg am Spiel.
|
|
|
12/01/2013, 19:27
|
#3
|
elite*gold: 338
Join Date: Aug 2010
Posts: 533
Received Thanks: 201
|
Quote:
Originally Posted by KDeluxe
Lass mich raten: Einfach alles zusammen kopiert?
Wofür ein Handle zum Lesen und Schreiben erstellen, wenn du es nicht machst? Mehr als ein ControlSend() machst du nicht, dafür brauchst du meine KDMemory.au3 UDF nicht. Da die offiziellen Server einen (schlechten) "Hackshield" verwenden kannst du die Control Befehle nicht verwenden. Den Speicher lesen und schreiben kannst du auch nicht ohne weiteres.
Es ist eigentlich nichts wirklich falsch, dass der Befehl nicht funktioniert liegt schlichtweg am Spiel.
|
1. Ja ich habe den oberen Teil kopiert. Wieso auch nicht? (Er funktionierte bis jetzt immer, da er von dir geschrieben ist.  )
2. Ich habe das Handle eingebaut, weil ich noch mehr einbauen will, wofür ich es brauche.
3. Es kann nicht am HS liegen, da das Spiel, wofür ich das Programm schreibe, kein HS hat.
Fazit: Grundsätzlich erkennst du keine Fehler bis auf die Tatsache, dass man GUI Events zu Beginn der While-Schleife setzen sollte.
MHM :S woran könnte es dann liegen?
Danke
|
|
|
12/01/2013, 19:39
|
#4
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
Konntest du bisher überhaupt ein Resultat erreichen?
Ansonsten kannst du es mit einem simplen Send (zuerst) versuchen und dann, sofern es nicht geht, _SendMessage.
|
|
|
12/01/2013, 19:51
|
#5
|
elite*gold: 338
Join Date: Aug 2010
Posts: 533
Received Thanks: 201
|
Quote:
Originally Posted by alpines
Konntest du bisher überhaupt ein Resultat erreichen?
Ansonsten kannst du es mit einem simplen Send (zuerst) versuchen und dann, sofern es nicht geht, _SendMessage.
|
Also eigentlich soll das Programm ja das Inventar mit "i" öffnen.
Man kann das auch via Memory Write machen, allerdings wollte ich es einmal so ausprobieren.
Jedoch öffnet sich das Inventar nicht.
Aber ich werde deine Vorschläge mal ausprobieren.  Danke
|
|
|
12/01/2013, 19:56
|
#6
|
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
|
Die MemoryWrite Variante wäre meiner Meinung nach sicherer, da du nachprüfen kannst ob es sich wirklich geöffnet hat und du nicht per PixelSearch danach suchen musst.
|
|
|
12/01/2013, 20:00
|
#7
|
elite*gold: 338
Join Date: Aug 2010
Posts: 533
Received Thanks: 201
|
Quote:
Originally Posted by alpines
Die MemoryWrite Variante wäre meiner Meinung nach sicherer, da du nachprüfen kannst ob es sich wirklich geöffnet hat und du nicht per PixelSearch danach suchen musst.
|
Ja, das Inventar ist in diesem Falle nur ein Beispiel.
Ich will eigentlich nur mein Wissen etwas erweitern und ein wenig herumprobieren und dabei ist mir eben die Frage gekommen, wie ich bestimmte Befehle "simulieren" kann.
|
|
|
12/01/2013, 22:29
|
#8
|
elite*gold: 0
Join Date: Mar 2009
Posts: 7,260
Received Thanks: 33,149
|
Das sollte man meiner Meinung nach immer mit dem Speicher lösen (kommt natürlich auf die Anwendung drauf an). Ich kann mich auch irren, aber ControlSend() dürfte allgemein nicht funktionieren. PostMessage funktioniert allerdings, das weiß ich noch, da ich jemandem dabei geholfen habe.
Bei 4Story hast du es noch sehr einfach, sämtliche Fenster im Spiel lassen sich über "0" ausblenden und "1" einblenden.
Mit meinem Beispiel möchte ich dir ebenfalls den einfachen Aufbau der Pointer von 4Story verdeutlichen:
Code:
#include "KDMemory.au3"
GUICreate("Test", 250, 150)
$btn_Shop = GUICtrlCreateButton("Shop Informationen", 0, 0, 250, 75)
$btn_Inventory = GUICtrlCreateButton("Inventar Informationen", 0, 75, 250, 75)
GUISetState()
Dim $handles = 0
Const $processName = "TClient.exe"
Const $baseAddress = 0x00772DD8
Const $shopOffset = 0x04FC, $inventoryOffset = 0x035C
Const $isVisibleOffset = 0x0140, $positionXOffset = 0x0100, $positionYOffset = 0x0104
Const $offsets_ShopIsVisible[2] = [$shopOffset, $isVisibleOffset]
Const $offsets_ShopPositionX[2] = [$shopOffset, $positionXOffset]
Const $offsets_ShopPositionY[2] = [$shopOffset, $positionYOffset]
Const $offsets_InventoryIsVisible[2] = [$inventoryOffset, $isVisibleOffset]
Const $offsets_InventoryPositionX[2] = [$inventoryOffset, $positionXOffset]
Const $offsets_InventoryPositionY[2] = [$inventoryOffset, $positionYOffset]
While True
;~ Sleep()
$msg = GUIGetMsg()
Switch $msg
Case -3 ; $GUI_EVENT_CLOSE
Exit
EndSwitch
$processId = ProcessExists($processName)
If $processId == 0 Then
If IsArray($handles) Then
_KDMemory_CloseHandles($handles)
$handles = 0
EndIf
ContinueLoop
EndIf
If $handles == 0 Then
$handles = _KDMemory_OpenProcess($processId)
If @error Then
If MsgBox(52, "Error", "Can not open " & $processName & @CRLF & "! @error: " & @error & @CRLF & @CRLF & "Continue?") == 6 Then
$handles = 0
ContinueLoop
Else
Exit
EndIf
EndIf
EndIf
Switch $msg
Case $btn_Shop
$memoryData_ShopIsVisible = _KDMemory_ReadProcessMemory($handles, $baseAddress, "DWORD", $offsets_ShopIsVisible)
$memoryData_ShopPositionX = _KDMemory_ReadProcessMemory($handles, $baseAddress, "DWORD", $offsets_ShopPositionX)
$memoryData_ShopPositionY = _KDMemory_ReadProcessMemory($handles, $baseAddress, "DWORD", $offsets_ShopPositionY)
If Not IsArray($memoryData_ShopIsVisible) Or Not IsArray($memoryData_ShopPositionX) Or Not IsArray($memoryData_ShopPositionY) Then
MsgBox(48, "Fehler", "Shop Informationen können nicht gelesen werden.")
Else
MsgBox(64, "Shop Informationen", "Sichtbar: " & $memoryData_ShopIsVisible[1] & @CRLF & "Position X: " & $memoryData_ShopPositionX[1] & @CRLF & "Position Y: " & $memoryData_ShopPositionY[1])
EndIf
Case $btn_Inventory
$memoryData_InventoryIsVisible = _KDMemory_ReadProcessMemory($handles, $baseAddress, "DWORD", $offsets_InventoryIsVisible)
$memoryData_InventoryPositionX = _KDMemory_ReadProcessMemory($handles, $baseAddress, "DWORD", $offsets_InventoryPositionX)
$memoryData_InventoryPositionY = _KDMemory_ReadProcessMemory($handles, $baseAddress, "DWORD", $offsets_InventoryPositionY)
If Not IsArray($memoryData_InventoryIsVisible) Or Not IsArray($memoryData_InventoryPositionX) Or Not IsArray($memoryData_InventoryPositionY) Then
MsgBox(48, "Fehler", "Inventory Informationen können nicht gelesen werden.")
Else
MsgBox(64, "Inventory Informationen", "Sichtbar: " & $memoryData_InventoryIsVisible[1] & @CRLF & "Position X: " & $memoryData_InventoryPositionX[1] & @CRLF & "Position Y: " & $memoryData_InventoryPositionY[1])
EndIf
EndSwitch
WEnd
Falls du das ganze dennoch mit PostMessage probieren möchtest kannst du dafür  verwenden.
|
|
|
12/01/2013, 23:26
|
#9
|
elite*gold: 192
Join Date: May 2009
Posts: 2,227
Received Thanks: 3,262
|
Ich würde es ebenfalls über die RAM machen.
Sowie du ControlSend benutzt, kann es zu schwerwigenden Fehlern führen. Stell dir vor du hast mehrere Fenster offen, welche alle den gleichen Fensternamen ("4Story_GSP") besitzen. Da ich nicht weiß, wie ProcessExists mit Prozessen umgeht, die es mehrmals gibt, solltest du vorab prüfen, ob 4Story nur einmal läuft. Eventuell gibt es sogar schon Bibliotheken für AutoIt, die die Funktion createtoolhelp32snapshot implementiert haben und genaueres über aktive Prozesse sagen können.
|
|
|
12/02/2013, 03:04
|
#10
|
elite*gold: 0
Join Date: Mar 2009
Posts: 7,260
Received Thanks: 33,149
|
 verwende ich in meiner KDMemory UDF um die Module eines Prozesses durchzugehen. Das wäre auch einfacher gegangen, allerdings wollte ich ausschließlich Funktionen der Kernel32.dll verwenden. Meine Basis könnte man theoretisch ganz einfach ändern.
Verwendet man ausschließlich den RAM kann es einem egal sein, wie viele Fenster den selben Namen verwenden. Möchte man eine Kombination aus RAM und "Fenster" muss man dem Fenster einen Prozess zuordnen können. Das kann man mittels WinList() und WinGetProcess() (unbedingt das Window Handle (HWND) übergeben) lösen.
Code:
#include "KDMemory.au3"
GUICreate("Test", 250, 150)
$btn_Shop = GUICtrlCreateButton("Shop Informationen", 0, 0, 250, 75)
$btn_Inventory = GUICtrlCreateButton("Inventar Informationen", 0, 75, 250, 75)
GUISetState()
Const $windowName = "4Story_GSP"
Const $baseAddress = 0x00772DD8
Const $shopOffset = 0x04FC, $inventoryOffset = 0x035C
Const $isVisibleOffset = 0x0140, $positionXOffset = 0x0100, $positionYOffset = 0x0104
Const $offsets_ShopIsVisible[2] = [$shopOffset, $isVisibleOffset]
Const $offsets_ShopPositionX[2] = [$shopOffset, $positionXOffset]
Const $offsets_ShopPositionY[2] = [$shopOffset, $positionYOffset]
Const $offsets_InventoryIsVisible[2] = [$inventoryOffset, $isVisibleOffset]
Const $offsets_InventoryPositionX[2] = [$inventoryOffset, $positionXOffset]
Const $offsets_InventoryPositionY[2] = [$inventoryOffset, $positionYOffset]
While True
;~ Sleep()
$msg = GUIGetMsg()
Switch $msg
Case -3 ; $GUI_EVENT_CLOSE
Exit
EndSwitch
$winList = WinList($windowName)
For $i = 1 To $winList[0][0]
$processId = WinGetProcess($winList[$i][1])
If $processId == -1 Then
ConsoleWrite("unable to retrieve the PID; HWND: " & $winList[$i][1] & @CRLF)
ContinueLoop
EndIf
$handles = _KDMemory_OpenProcess($processId)
If @error Then
ConsoleWrite("unable to open the process; PID: " & $processId & "; HWND: " & $winList[$i][1] & "; @error: " & @error & @CRLF)
ContinueLoop
EndIf
Switch $msg
Case $btn_Shop
$memoryData_ShopIsVisible = _KDMemory_ReadProcessMemory($handles, $baseAddress, "DWORD", $offsets_ShopIsVisible)
$memoryData_ShopPositionX = _KDMemory_ReadProcessMemory($handles, $baseAddress, "DWORD", $offsets_ShopPositionX)
$memoryData_ShopPositionY = _KDMemory_ReadProcessMemory($handles, $baseAddress, "DWORD", $offsets_ShopPositionY)
If Not IsArray($memoryData_ShopIsVisible) Or Not IsArray($memoryData_ShopPositionX) Or Not IsArray($memoryData_ShopPositionY) Then
ConsoleWrite("Shop Informationen können nicht gelesen werden." & @CRLF)
Else
ConsoleWrite( _
"PID: " & $processId & "; $HWND: " & $winList[$i][1] & @CRLF & _
"Shop Informationen" & @CRLF & _
"Sichtbar: " & $memoryData_ShopIsVisible[1] & @CRLF & _
"Position X: " & $memoryData_ShopPositionX[1] & @CRLF & _
"Position Y: " & $memoryData_ShopPositionY[1] & @CRLF _
)
EndIf
Case $btn_Inventory
;~ ControlSend($winList[$i][1], "", "", "i")
$memoryData_InventoryIsVisible = _KDMemory_ReadProcessMemory($handles, $baseAddress, "DWORD", $offsets_InventoryIsVisible)
$memoryData_InventoryPositionX = _KDMemory_ReadProcessMemory($handles, $baseAddress, "DWORD", $offsets_InventoryPositionX)
$memoryData_InventoryPositionY = _KDMemory_ReadProcessMemory($handles, $baseAddress, "DWORD", $offsets_InventoryPositionY)
If Not IsArray($memoryData_InventoryIsVisible) Or Not IsArray($memoryData_InventoryPositionX) Or Not IsArray($memoryData_InventoryPositionY) Then
ConsoleWrite("Inventar Informationen können nicht gelesen werden." & @CRLF)
Else
ConsoleWrite( _
"PID: " & $processId & "; $HWND: " & $winList[$i][1] & @CRLF & _
"Inventar Informationen" & @CRLF & _
"Sichtbar: " & $memoryData_InventoryIsVisible[1] & @CRLF & _
"Position X: " & $memoryData_InventoryPositionX[1] & @CRLF & _
"Position Y: " & $memoryData_InventoryPositionY[1] & @CRLF _
)
EndIf
EndSwitch
_KDMemory_CloseHandles($handles)
Next
WEnd
|
|
|
 |
Similar Threads
|
Quest keine Wirkung :(
09/26/2013 - Metin2 Private Server - 8 Replies
Guten Tag,
Ich wollte so eine Quest hinzufügen : http://www.elitepvpers.com/forum/attachment.php?at tachmentid=106892&stc=1&d=1318518461
quest gemi begin
state start begin
when 9001.click begin
local shop_ids = {
{9001},
{9007},
|
Konzentriertes Lesen = keine wirkung ???
09/16/2012 - Metin2 Private Server - 18 Replies
Nabend,
ich habe folgendes Problem
normalerweise ist die Wirkung von Konzentriertes Lesen
das man 100% Bücher liest.
Doch irgendwie mag das bei mir nicht klappen?
Ich klicke ein Konzi an, eine Exo rolle
doch die Bücher failen so wie wenn ich garkein Konzi nehmen würde..
Mir hat schon jemand gesagt das man es mit einer Dif patchen muss
|
Rüstungsskin geändert ~ Ingame keine Wirkung
09/10/2012 - Metin2 Private Server - 15 Replies
Titel beschreibt alles.
Ich versuche jetzt schon seit 3 Stunden das Problem zu lösen, da ich ein paar Rüstungen ändern will und dann als neue einfügen möchte, ich teste vorher aber die Skins an den alten Rüstungen (70er)
Unter anderem habe ich auch die Smaragd Rüssis geändert, aber ingame keine Wirkung.
Habe schon die msm geändert (Theoretisch dürfte man jetzt nur noch eine weiße Smaragd Rüssi ingame sehen) Aber der Skin ist trotzdem noch da...
Also ich habe in der msm den Namen...
|
Pc zeigt keine Taskleiste und keine Icons mehr an!!
04/25/2011 - Technical Support - 4 Replies
Hallo zusammen,
als ich meinen Pc gestern startete, zeigte er keine Icons und keine Taskleiste mehr an. Wenn ich den Task-Manager öffnen will, wird der Bildschirm einige Zeit schwarz und nach einigem Warten erscheint wieder der leere Desktop. Meine Maus ist vorhanden und ich kann auf alle Ordner zugreifen(Rechtsklick;Anpassen;Ziel ändern), aber ich kann keine Dateien ausführen. Das komische ist aber das alle Icons und die Taskleiste im Abgesichertem Modus vorhanden sind und ich sie dort auch...
|
All times are GMT +1. The time now is 12:10.
|
|