Mausklick an Webgadget senden

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Mausklick an Webgadget senden

Beitrag von Dostej »

Hallo zusammen

Ich habe ein kleines Programm, das wie ein Makrorecoder funktionert (funktionieren soll) um in einem Browsergame das nervtötende "204 Felder 2x nacheinander klicken" mir zu vereinfachen.

Der Rekoder an sich geht gut, nur das Abspielen tut nicht. Ich habe verschiedene Sachen probiert:

Code: Alles auswählen

SetCursorPos_(Macros()\x + 4, Macros()\y + 23)
mouse_event_(#MOUSEEVENTF_LEFTDOWN, Macros()\x + 4, Macros()\y + 23, 0, 0)


SimulateClick(Macros()\x + 4, Macros()\y + 23)
      

Import ""
  PB_Gadget_SendGadgetCommand(hwnd, EventType)
EndImport
PB_Gadget_SendGadgetCommand(GadgetID(#Web_0), #PB_EventType_LeftClick)



Procedure SimulateClick(x.w, y.w)
  SendMessage_(WinHandle_I, WM_LBUTTONDOWN, 0, x + (y << 16));
  SendMessage_(WinHandle_I, WM_LBUTTONUP, 0, x + (y << 16));
EndProcedure

habs nicht wirklich hinbekommen... Maus positionieren geht, aber er sendet kein Klick...

Kann mir jemand helfen, wie man einen Mausklick an ein Webgadget schickt?
Hab ich irgendwas übersehen?


Hier der gesamte Code...

Code: Alles auswählen


;{ Constants
;- Window Constants
;
Enumeration
  #Window_Meerkatze
EndEnumeration

;- MenuBar Constants
;
Enumeration
  #MenuBar_0
EndEnumeration

;- Keyboard SK
Enumeration
  #KB_F2
  #KB_F3
  #KB_1
  #KB_2
EndEnumeration


;- Gadget Constants
;
Enumeration
  #Web_0
  #Frame3D_MK_Record
  #Frame3D_MK_Play
  #Combo_MK_Play_Modus
  #Text_MK_Play_Modus
  #Text_MK_Rec_Name
  #String_MK_Rec_Name
  #Button_MK_Rec
  #Text_MK_Play_Anz
  #Spin_MK_Play_Anz
  #Text_MK_Play_Wait
  #Spin_1
  #Text_MK_Play_min
  #CheckBox_MK_Play_Repeat
  #Button_MK_Play_Run
  #Frame3D_MK_Auto
  #CheckBox_MK_Auto_
EndEnumeration

CompilerIf #PB_Compiler_OS = #PB_OS_Linux
  #BackSlash ="/"
CompilerElse 
  #BackSlash ="\"
CompilerEndIf
#ExtMacro = ".mcr"

#FileTemp = 0
#Dir = 0
;}

;{ Vars
Structure mcr
  x.l
  y.l
  Text_S.s
  Delay.l
EndStructure

Global NewList Macros.mcr()

Global WinHandle_I.i 

;}

Import ""
  PB_Gadget_SendGadgetCommand(hwnd, EventType)
EndImport
; 

Procedure SimulateClick(x.w, y.w)
  SendMessage_(WinHandle_I, WM_LBUTTONDOWN, 0, x + (y << 16));
  SendMessage_(WinHandle_I, WM_LBUTTONUP, 0, x + (y << 16));
EndProcedure

Procedure LeseMacroListe() ; liest alle Macros in die Combobox ein
  S.s
  
  ClearGadgetItems(#Combo_MK_Play_Modus)
  If ExamineDirectory(#Dir, "Macros" + #BackSlash, "")
    While NextDirectoryEntry(#Dir)
      If DirectoryEntryType(#Dir) = #PB_DirectoryEntry_File
        S = DirectoryEntryName(#Dir)
        AddGadgetItem(#Combo_MK_Play_Modus, -1, StringField(S, 1, "."))
      EndIf
    Wend
    FinishDirectory(#Dir)
  EndIf
  
EndProcedure
Procedure SaveMacro(Name_S.s) ; speichert das Macro
  OK_I.i
  
  While FileSize("Macros" + #BackSlash + Name_S + #ExtMacro) > -1
    If MessageRequester("Dateiname schon vorhanden", "Soll die Datei überschrieben werden?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
      OK_I = 1
    Else
      Name_S = InputRequester("DateiName umbenennen", "Geben Sie einen anderen Dateinamen an", Name_S)
      OK_I = 1
    EndIf
    
  Wend
  
  If CreateFile(#FileTemp, "Macros" + #BackSlash + Name_S + #ExtMacro)
    WriteLong(#FileTemp, ListSize(Macros()))
    ForEach Macros()
      WriteLong(#FileTemp, Macros()\x)
      WriteLong(#FileTemp, Macros()\y)
      WriteStringN(#FileTemp, Macros()\Text_S)
      WriteLong(#FileTemp, Macros()\Delay)
    Next
    CloseFile(#FileTemp)
  EndIf
  LeseMacroListe()
EndProcedure
Procedure LoadMacro(Name_S.s) ; läd das Macro
  If ReadFile(#FileTemp, "Macros" + #BackSlash + Name_S + #ExtMacro)
    ClearList(Macros())
    n = ReadLong(#FileTemp)
    For x = 1 To n
      AddElement(Macros())
      Macros()\x = ReadLong(#FileTemp)
      Macros()\y = ReadLong(#FileTemp)
      Macros()\Text_S = ReadString(#FileTemp)
      Macros()\Delay = ReadLong(#FileTemp)
    Next
    CloseFile(#FileTemp)
  EndIf
EndProcedure
Procedure PlayMacro() ; spielt das aktuelle Macro
  
  ForEach Macros()
    Delay(Macros()\Delay)
    SetCursorPos_(Macros()\x + 4, Macros()\y + 23)
    If Macros()\Text_S = "" ;kein Text, also Mausklick
      Debug "klick"
      SimulateClick(Macros()\x + 4, Macros()\y + 23)
      ; mouse_event_(#MOUSEEVENTF_LEFTDOWN, Macros()\x + 4, Macros()\y + 23, 0, 0)
      ; PB_Gadget_SendGadgetCommand(GadgetID(#Web_0), #PB_EventType_LeftClick)
    Else
      ; gebe den Text aus
      
    EndIf 
  Next
  
EndProcedure


Procedure Open_Window_Meerkatze()
  StartMacro_I.i
  StartTime_I.i
  MouseDown.i
  StartpunktX_I.i = -1 ; für die Autofunktion
  StartpunktY_I.i
  EndpunktX_I.i = -1
  EndpunktY_I.i
  Diff_I.i = 40
  
  S.s
  
  WinHandle_I = OpenWindow(#Window_Meerkatze, 0, 0, 1230, 860, "Meerkatze",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar ) ;{
  Debug "WinHandle_I"  + Str(WinHandle_I)
  If WinHandle_I
    If CreateMenu(#MenuBar_0, WindowID(#Window_Meerkatze))
      MenuTitle("")
      MenuItem(#KB_F2, "1")
      MenuItem(#KB_F3, "2")
      MenuItem(#KB_1, "1")
      MenuItem(#KB_2, "2")
      HideMenu(#KB_F2, 1)
      HideMenu(#KB_F2, 1)
      HideMenu(#KB_1, 1)
      HideMenu(#KB_2, 1)
    EndIf
    
    AddKeyboardShortcut(#Window_Meerkatze, #PB_Shortcut_F2, #KB_F2)
    AddKeyboardShortcut(#Window_Meerkatze, #PB_Shortcut_F3, #KB_F3)
    AddKeyboardShortcut(#Window_Meerkatze, #PB_Shortcut_1, #KB_1)
    AddKeyboardShortcut(#Window_Meerkatze, #PB_Shortcut_2, #KB_2)
    
    
    Frame3DGadget(#Frame3D_MK_Record, 1050, 40, 170, 130, "Aufnehmen")
    Frame3DGadget(#Frame3D_MK_Play, 1050, 210, 170, 200, "Abspielen")
    ComboBoxGadget(#Combo_MK_Play_Modus, 1060, 250, 150, 20)
    TextGadget(#Text_MK_Play_Modus, 1060, 230, 150, 20, "Abspielen", #PB_Text_Center | #PB_Text_Border)
    TextGadget(#Text_MK_Rec_Name, 1060, 63, 35, 17, "Name")
    StringGadget(#String_MK_Rec_Name, 1100, 60, 110, 20, "")
    ButtonGadget(#Button_MK_Rec, 1080, 140, 110, 20, "Aufnahme", #PB_Button_Default | #PB_Button_Toggle)
    TextGadget(#Text_MK_Play_Anz, 1060, 293, 50, 17, "Anzahl")
    SpinGadget(#Spin_MK_Play_Anz, 1120, 290, 60, 20, 0, 10)
    TextGadget(#Text_MK_Play_Wait, 1060, 320, 50, 17, "Wartezeit")
    SpinGadget(#Spin_1, 1120, 317, 60, 20, 0, 10)
    TextGadget(#Text_MK_Play_min, 1180, 320, 20, 17, "min")
    CheckBoxGadget(#CheckBox_MK_Play_Repeat, 1060, 350, 150, 20, "Wiederholen")
    ButtonGadget(#Button_MK_Play_Run, 1080, 370, 110, 20, "Run", #PB_Button_Default | #PB_Button_Toggle)
    Frame3DGadget(#Frame3D_MK_Auto, 1050, 430, 170, 200, "Automation")
    CheckBoxGadget(#CheckBox_MK_Auto_, 1060, 460, 150, 20, "Pflanzen/Wässern")
    WebGadget(#Web_0, 10, 10, 1024, 768, "http://www.kapibados.de")
    ;}
    
    LeseMacroListe()
    
    Repeat
      Event = WaitWindowEvent() 
      WindowID = EventWindow() 
      GadgetID = EventGadget() 
      EventType = EventType() 
      
      ; Debug Str(WindowMouseX(#Window_Meerkatze)) + " - " + Str(WindowMouseY(#Window_Meerkatze))
      
      If Event = #PB_Event_Menu ;{
        MenuID = EventMenu()
        
        If MenuID = #KB_F2
          If StartMacro_I = 0
            StartMacro_I = 1
            StartTime_I = ElapsedMilliseconds()
            SetGadgetState(#Button_MK_Rec, 1)
          EndIf
          
        ElseIf MenuID = #KB_F3
          If StartMacro_I = 1
            StartMacro_I = 0
            SaveMacro(GetGadgetText(#String_MK_Rec_Name))
            SetGadgetState(#Button_MK_Rec, 0)
          EndIf
          
        ElseIf MenuID = #KB_1
          If StartpunktX_I = -1
            StartpunktX_I = WindowMouseX(#Window_Meerkatze)
            StartpunktY_I = WindowMouseY(#Window_Meerkatze)
          EndIf
        ElseIf MenuID = #KB_2
          If StartpunktX_I <> -1
            EndpunktX_I = WindowMouseX(#Window_Meerkatze)
            EndpunktY_I = WindowMouseY(#Window_Meerkatze)
            
            a = (EndpunktX_I - StartpunktX_I) / Diff_I
            b = (EndpunktY_I - StartpunktY_I) / Diff_I
            For x = 0 To a-1
              For y = 0 To b-1
                Delay(Random(150) + 250)
                SetCursorPos_(StartpunktX_I + x * Diff_I + 4, StartpunktY_I + y * Diff_I + 23)
                PB_Gadget_SendGadgetCommand(GadgetID(#Web_0), #PB_EventType_LeftClick)
              Next
            Next
            StartpunktX_I = -1 ; autofunktion zurücksetzen
          EndIf
        EndIf
      EndIf
      ;}
      
      If StartMacro_I = 1 ;{
        ; wenn Maustaste loslassen erkennen
        If GetAsyncKeyState_(#VK_LBUTTON)
          MouseDown = 1 
        Else
          If MouseDown = 1
            MouseDown = 0
            AddElement(Macros())
            Macros()\x = WindowMouseX(#Window_Meerkatze)
            Macros()\y = WindowMouseY(#Window_Meerkatze)
            Macros()\Text_S = ""
            Macros()\Delay = ElapsedMilliseconds() - StartTime_I 
          EndIf
        EndIf
        
        ; Tastatureingabe abfragen
        If 0
          
          
        EndIf
      EndIf
      ;}
      
      If Event = #PB_Event_Gadget ;{
        
        If GadgetID = #Web_0
          
        ElseIf GadgetID = #Combo_MK_Play_Modus
          
        ElseIf GadgetID = #String_MK_Rec_Name
          
        ElseIf GadgetID = #Button_MK_Rec ;{
          If EventType = #PB_EventType_LeftClick
            n = GetGadgetState(#Button_MK_Rec)
            If n = 0
              StartMacro_I = 0
              SaveMacro(GetGadgetText(#String_MK_Rec_Name))
            Else
              StartMacro_I = 1
            EndIf
          EndIf
          ;}
        ElseIf GadgetID = #Spin_MK_Play_Anz
          
        ElseIf GadgetID = #Spin_1
          
        ElseIf GadgetID = #CheckBox_MK_Play_Repeat
          
        ElseIf GadgetID = #Button_MK_Play_Run ;{
          If EventType = #PB_EventType_LeftClick
            n = GetGadgetState(#Combo_MK_Play_Modus)
            If n <> -1
              S = GetGadgetItemText(#Combo_MK_Play_Modus, n)
              LoadMacro(S)
              PlayMacro()
              SetGadgetState(#Button_MK_Play_Run, 0)
            EndIf
          EndIf
          ;}
        ElseIf GadgetID = #CheckBox_MK_Auto_
          
        EndIf
        ;}
      EndIf
      
    Until Event = #PB_Event_CloseWindow ; End of the event loop
    
  EndIf
EndProcedure


Open_Window_Meerkatze()

End


Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Mausklick an Webgadget senden

Beitrag von Kiffi »

mal schnell aus der Hüfte geschossen:

muss es nicht x ODER y heißen?

Code: Alles auswählen

Procedure SimulateClick(x.w, y.w)
  SendMessage_(WinHandle_I, #WM_LBUTTONDOWN, 0, x | (y << 16));
  SendMessage_(WinHandle_I, #WM_LBUTTONUP, 0, x | (y << 16));
EndProcedure
Grüße ... Kiffi

//Edit: und die #WM_* - Konstanten sollten auch als solche geschrieben werden ;-)
a²+b²=mc²
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Re: Mausklick an Webgadget senden

Beitrag von Dostej »

Ist das Ergebnis (in dem Fall - wenn die Vars nicht zu gross sind) nicht das gleiche?

Code: Alles auswählen

x = 123
y = 657
Debug x | (y << 16)
Debug x + (y << 16)
Debug Bin(x | (y << 16))
Debug Bin(x + (y << 16))

43057275
43057275
10100100010000000001111011
10100100010000000001111011
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: Mausklick an Webgadget senden

Beitrag von PureLust »

Dostej hat geschrieben:Der Rekoder an sich geht gut, nur das Abspielen tut nicht. Ich habe verschiedene Sachen probiert:
Öhhm ... könntest Du vielleicht kurz erklären wie das mit dem Aufnehmen funktionieren soll (also was genau man dafür tun muss)?

Greetz, PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Re: Mausklick an Webgadget senden

Beitrag von Dostej »

Nichts schwieriges.
Wenn man F2 drückt, speichert das Programm alle nach folgenden Mauspositionen, wenn man die Links Maustaste drückt. Mit F3 beendet man das Aufzeichnen und schriebt die Daten in ne Datei.
Die kann man dann wieder aufrufen und abspielen lassen, wobei dann der Mauscursor auf die Stelle gesetzt wird (soweit so gut) und dann dort einen Linksklick simulieren soll. Genau das kriege ich aber nicht hin...
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: Mausklick an Webgadget senden

Beitrag von PureLust »

Wenn ich das richtig verstanden habe, so muss man bei "Name" den Namen des Makros eingeben (habe meins mal "Test" genannt).
Dann mit F2 die Aufnahme starten - ein wenig rumklicken und ggfl. eintragen - und mit F3 die Aufnahme wieder beenden.

Hiernach sollte vermutlich das aufgenommene Makro in der Liste unter "Abspielen" erscheinen - nur ... es erscheint dort nicht !!! :roll:
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Mausklick an Webgadget senden

Beitrag von Kiffi »

PureLust hat geschrieben:Hiernach sollte vermutlich das aufgenommene Makro in der Liste unter "Abspielen" erscheinen - nur ... es erscheint dort nicht !!! :roll:
Du musst noch den Ordner 'Macros' anlegen. Dann werden die Makros
dort nach dem Aufzeichnen abgelegt und erscheinen auch im Dropdown.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Re: Mausklick an Webgadget senden

Beitrag von Dostej »

Ja, es braucht den Ordner Macros...

aber darum geht es eigentlich nicht, denke ich. Das geht ja. Es geht darum, das er die Mausklicks nicht macht...
Benutzeravatar
.:M:.
Beiträge: 44
Registriert: 29.07.2008 04:12

Re: Mausklick an Webgadget senden

Beitrag von .:M:. »

Das Handle des Browsers innerhalb des Webgadgets ist nicht dasselbe wie das Webgadget selbst.
D.h. das Webgaddet sind eigentlich immer 2 verschiedene Fenster - einmal der Container von PB und dann der Browsers selbst.
Du brauchst also das Handle von dem Browser und nicht von dem Container (=Webgadget), sonst geht der
Befehl an das falsche Fenster.

Dazu positionierst Du am Besten kurz den Zeiger über dem Browser innerhalb des Webgadgets und führst dann

Code: Alles auswählen

hWnd=WindowFromPoint_(x,y)

aus.
PB 5.11 Beta1 32Bit | Win 7 Pro 64Bit
Benutzeravatar
ralle
Beiträge: 88
Registriert: 29.11.2004 17:50
Wohnort: Berlin

Re: Mausklick an Webgadget senden

Beitrag von ralle »

(OT)
Dostej hat geschrieben:Ich habe ein kleines Programm, ... um in einem Browsergame das nervtötende "204 Felder 2x nacheinander klicken" ... zu vereinfachen.
Dir ist aber klar, dass genau das zumeist nach AGB verboten ist und mit Sicherheit bei Erkennung zu deinem Ausschluss führen wird? Diesbezüglich solltest du versuchen dein Programm zu tarnen und keine offensichtlichen "Fehler" zu machen, wie z.B. über 200 Mausklicks auf verschiedene Felder in unter 2 Sekunden. Aber ein sogenannter Bot wird es immer bleiben und die sind immer (ich kenne kein Browser-Spiel, wo es nicht so ist) untersagt.
(/OT)
mfG
Ralle
Antworten