Mousepress und keypress an Programm senden?
Mousepress und keypress an Programm senden?
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).
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).
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
> ...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:
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.

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:

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.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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.
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.
Der Weise weiß, dass er ein Narr ist.
> 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?
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

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?
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
> 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...
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.
Der Weise weiß, dass er ein Narr ist.
So
Also die Fenster wuerd ich mit Hilfe von EnumChildWindows auslesen,
anhand der Klasse und Titel kannst du es dann eventuell identifizieren.
Beispiel :
Sender:
Empfaenger :
Gibt aber mit Sicherheit bessere Methoden.

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
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
Zuletzt geändert von edel am 22.04.2007 00:19, insgesamt 1-mal geändert.
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
ESCAPE bei CS simulieren funzt nicht
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

gruß oNNy
http://www.onnsoft.de
http://www.onnsoft.de
- 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
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.
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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
Dann trau ich mich ans rumprobieren 
HABS: AU3_ControlSend("Counter-Strike","","", "{ESC}")
danke!
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


HABS: AU3_ControlSend("Counter-Strike","","", "{ESC}")
danke!
gruß oNNy
http://www.onnsoft.de
http://www.onnsoft.de