Mousepress und keypress an Programm senden?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Mousepress und keypress an Programm senden?

Beitrag 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).
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Ich muss nämlich einiges auf diesem Fenster ausführen, ohne das der Anwender was davon mitkriegt.

...was hast du vor? :?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag 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.
Zuletzt geändert von TomS am 11.03.2007 02:40, insgesamt 1-mal geändert.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag 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?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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.
Zuletzt geändert von edel am 22.04.2007 00:19, insgesamt 1-mal geändert.
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag 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 :(
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
onny
Beiträge: 400
Registriert: 27.04.2005 17:50
Kontaktdaten:

Beitrag 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!
Antworten