Seite 1 von 2

Mousepress und keypress an Programm senden?

Verfasst: 09.03.2007 23:47
von TomS
Hallo.
Gibt es irgendwie die Möglichkeit Mausklicks und Tastendrucke an eine fremde Anwendung zu senden, dass nicht das oberste Fenster hat bzw. wenn man es mit ShowWindow(hWnd,#SW_HIDE) versteckt hat?

Ich muss nämlich einiges auf diesem Fenster ausführen, ohne das der Anwender was davon mitkriegt. Und das geht nicht, wenn die ganze Zeit diese Andwendung mein Fenster verdeckt. (auch wenns nur kurz ist).

Verfasst: 10.03.2007 15:08
von Kaeru Gaman
> Ich muss nämlich einiges auf diesem Fenster ausführen, ohne das der Anwender was davon mitkriegt.

...was hast du vor? :?

Verfasst: 11.03.2007 02:11
von TomS
> ...was hast du vor? :?

Na was wohl?! Einen Virus oder Trojaner, wie alle Programmierer, die schonmal danach gefragt haben, wie man andere Anwendungen steuert, oder irgendetwas im Hintergrund ausführt.

http://img143.imageshack.us/img143/2192 ... e02jy6.jpg
EDIT: Link angepasst.


Das is die Programmoberfläche von einem Programm, mit dem man Scheinwerfer/Scanner/Laser etc vom PC aus steuern kann. Und ich würde gerne ein alternatives Frontend basteln, damit Leute, die sich nicht damit auskennen, auch Licht steuern können. Das sollte so laufen: Ich programmiere eine Sequenz und der andere Benutzer startet mein Programm und kann die einzelnen Scenes/Steps ansteuern.

So ist er nicht mit der Komplexität des Programms überfordert und ich muss keine Angst haben, dass meine Einstellungen danach alle verstellt sind.

Immo sieht das so aus: Bild

Das Programm soll halt am Anfang die Sequenz laden, die der Anwender haben will. Im Moment mach ich das, in dem ich das LightJockey Fenster in den Vordergrund hole und Mouseklicks simuliere. Das Selbe wenn man auf nächste Szene (">") klickt. Das LightJockey Fenster wird in den Vordergrund geholt und ein Tastendruck #VK_RIGHT erzeugt. Und das stört mich, dass ich immer das Fenster kurzeitig in den Vordergrund holen muss.

Verfasst: 11.03.2007 02:18
von Kaeru Gaman
das einzige, was mir da spontan einfällt, wäre, dass du dein kleines fenster alwaysontop setzt,
und übereinem bereich plazierst, der für die steuerung das anderen nicht benötigt wird.

natürlich wäre das andere dann immernoch sichtbar, und auch für den anwender zugänglich.

wenn du präzise die events kennen würdest, auf den die anwendung reagiert, könntest du dem task die events senden, und müßtest keine tastendrücke simulieren.

das problem ist doch eher folgendes:
entweder du braucht ein sequenzerprogramm, dass eine einfache steueroberfläche
besitzt die sich über der einrichtungs-/programmierungs-ebene befindet,
oder du braucht einen bediener, auf den du dich verlassen kannst dass er nicht an deinen einstellungen herumpfuscht.

Verfasst: 11.03.2007 02:34
von TomS
> oder du braucht einen bediener, auf den du dich verlassen kannst dass er nicht an deinen einstellungen herumpfuscht.

Das fällt leider schon mal flach. Und wenn man auf den falschen Knopf drückt und von der Fensterflut (zu sehen auf Bild) überrascht wird, kann es leicht passieren, dass man etwas aus versehen verändert.

Es gibt bereits ein Programm, das den LJ steuern kann, nur leider kein Opensource und auch ziemlich komplex. Das dient eher zur Queue-Steuerung (So was wie Threads in Purebasic ;) Man kann gleichzeitig ablaufende Events an und ausschalten. z.B Farbwechsel und Kreisbewegung. Quasi für die Liveperformance in ner Disco etc.) Aber für's Theater braucht man eben nen linearen Ablauf. Und das untersützt dieses Zusatz-Programm leider nicht so gut.

Jemand (edel?) hat mal geschrieben, dass man mit Sendmessage_() arbeiten kann, wenn man handle von jedem Gadget kennt. Gibt es ne Möglichkeit die rauszufinden?

Verfasst: 11.03.2007 06:46
von Kaeru Gaman
> Jemand (edel?) hat mal geschrieben, dass man mit Sendmessage_() arbeiten kann, wenn man handle von jedem Gadget kennt.

darauf so ungefähr wollte ich hinaus mit
>> wenn du präzise die events kennen würdest, auf den die anwendung reagiert, könntest du dem task die events senden, und müßtest keine tastendrücke simulieren.

> Gibt es ne Möglichkeit die rauszufinden?
puh.. möglicherweise...
aber wart mal, edel kennt sich mit sowas wirklich besser aus...

Verfasst: 11.03.2007 07:31
von edel
So :?

Also die Fenster wuerd ich mit Hilfe von EnumChildWindows auslesen,
anhand der Klasse und Titel kannst du es dann eventuell identifizieren.

Beispiel :

Sender:

Code: Alles auswählen

Procedure enumchild(hwnd,parent)
  Buffer.s = Space(255) 
  GetClassName_(hwnd,@Buffer,255)  
  If LCase(Buffer) = "button"
    id = GetDlgCtrlID_(hwnd)   
    PostMessage_(parent,#WM_COMMAND,(id | (#BN_CLICKED << 16)),hwnd) 
    ProcedureReturn 1
  EndIf
EndProcedure

hwnd = FindWindow_(0,"anderes fenster")
EnumChildWindows_(hwnd,@enumchild(),hwnd)

End
Empfaenger :

Code: Alles auswählen

hwnd = OpenWindow(0,0,0,200,200,"anderes fenster")

CreateGadgetList(hwnd)
ButtonGadget(0,0,0,100,20,"button 1")
ButtonGadget(1,0,30,100,20,"button 2")

Repeat
  e = WaitWindowEvent()
  
  If e = #PB_Event_Gadget
    Select EventGadget()
      Case 0
        Debug "Button 1 klick"
      Case 1
        Debug "Button 2 klick"
    EndSelect
  EndIf
  
Until e = 16
Gibt aber mit Sicherheit bessere Methoden.

Verfasst: 14.03.2007 21:41
von onny
hm, genau diese frage stelle ich mich gerade auch. ich habs geschafft einen tastendruck mit pb in einem aktiven fremdfenster zu simulieren, doch wie in einem inaktiven oO

Code: Alles auswählen

Procedure makelparam(low.w,high.w)
  ProcedureReturn
EndProcedure

Procedure enumchild(hwnd,parent)
  Buffer.s = Space(255)
  GetClassName_(hwnd,@Buffer,255) 
  If LCase(Buffer) = "button"
    id = GetDlgCtrlID_(hwnd)   
    PostMessage_(parent,#VK_ESCAPE,#VK_ESCAPE,hwnd)
    ProcedureReturn 1
  EndIf
EndProcedure

hwnd = FindWindow_(0,"Counter-Strike")
EnumChildWindows_(hwnd,@enumchild(),hwnd)

End


ESCAPE bei CS simulieren funzt nicht :(

Verfasst: 14.03.2007 21:56
von ts-soft
Mit AutoIt3.dll kannste direkt die Strings an die entsprechenden Controls
senden. Wrapper, der auch die DLL included findeste im letzen Thread:
http://www.purebasic.fr/english/viewtop ... 0&start=15

Die Au3Info.exe sollteste Du Dir evtl. auch von der autoit-homepage
besorgen, damit kannste die Namen der Controls auslesen. Handel gehen
aber auch.

Verfasst: 14.03.2007 22:36
von onny
hm, wenn du mich meinst... ich weiss nur wie man commands wie esc sendet wenn fenster aktiv ist... Und controls kapier ich nicht. Bei CS (zB) kommt:
Class Name: Valve001
Window Text: Counter-Strike

Hm ja, inaktive fentser kann ich wohl oder übel nur über Controls ansteuern... Hast du vllt. noch einen Tipp/Denkanstoß für mich? Wäre super :allright: Dann trau ich mich ans rumprobieren ;-)

HABS: AU3_ControlSend("Counter-Strike","","", "{ESC}")
danke!