Seite 1 von 3

Space Taste wurde gedrückt und Input senden an

Verfasst: 02.08.2016 17:04
von udg
Ich habe ein soundProgramm offen mit dem ich viel arbeite. nun liegt unter der SPACE Taste die Funktion Play.
Ich dachte mir:
... wenn das SoundProgramm offen ist, lade ich mir zugleich ein kleines Fenster mit einem PlayButton unter dem der Befehl, "KeyHit Space" liegt wenn ich auf Play drücke.
Wie mache ich am besten klar, dass mein Playbutton mit dem Soundprogramm zusammenarbeitet, dass der Space Hit Befehl an das Soundprogramm geschickt wird und abspielt?

Code: Alles auswählen

Enumeration
  #Window_0
EndEnumeration

Enumeration
  #Btn_play
EndEnumeration

Define.i Event, EventWindow, EventGadget, EventType, EventMenu

Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 727, 371, 214, 119, " ", #PB_Window_BorderLess)
     SetWindowPos_(WindowID(#Window_0),#HWND_TOPMOST,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE)
     ButtonGadget(#Btn_play, 39, 37, 130, 45, "play")
  EndIf
EndProcedure

OpenWindow_Window_0()

Repeat
  Event = WaitWindowEvent()
  Select Event

    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #Btn_play
        SetGadgetState(#Btn_play, #PB_Key_Space)
        Debug"space"  
      EndIf

    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
ForEver

Re: Space Taste wurde gedrückt und Input senden an

Verfasst: 02.08.2016 17:17
von RSBasic
Das sind wahrscheinlich zwei verschiedene/getrennte EXE-Dateien und du möchtest eine Datenverbindung herstellen?
Falls ja, dann gibt es viele Möglichkeiten:
a) Entweder simulierst du einen Buttonklick mit:

Code: Alles auswählen

SendMessage_(Handle, #BM_CLICK, 0, 0)
b) Du nutzt ein Callback, um Daten zwischen zwei Fenster zu senden und zu empfangen: http://www.rsbasic.de/aktualisierung/wi ... mserver.pb & http://www.rsbasic.de/aktualisierung/wi ... mclient.pb
c) SharedMemory: http://www.purebasic.fr/german/viewtopic.php?t=16659

Ich hoffe, ich habe dich richtig verstanden. Falls nicht, dann einfach nochmal für mich erklären.

Re: Space Taste wurde gedrückt und Input senden an

Verfasst: 02.08.2016 17:45
von udg
RSBasic hat geschrieben:Das sind wahrscheinlich zwei verschiedene/getrennte EXE-Dateien und du möchtest eine Datenverbindung herstellen?
Genau
RSBasic hat geschrieben: a) Entweder simulierst du einen Buttonklick mit:

Code: Alles auswählen

SendMessage_(Handle, #BM_CLICK, 0, 0)
das wäre ja das einfachste, unter meinen Button einfach:

Code: Alles auswählen

Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #Btn_play
        SendMessage_(Handle, #BM_CLICK, 0, 0)
        Debug"space"  
      EndIf
ich habe beide Programme offen, das Soundprogramm und die nun kompilierte Exe. der Space Klick kommt im tool an, will heißen:
drücke ich space dann drückt es den Button Play in meinem Tool. Also klappt das schon mal.
Wenn ich nun mit der Maus auf den Play Button drücke wird jedoch der SPACE = Play in Soundprogramm Befehl nicht angenommen. Das Tool kommuniziert nicht mit dem Soundprogramm.

Re: Space Taste wurde gedrückt und Input senden an

Verfasst: 02.08.2016 20:19
von RSBasic
Die Variable "Handle" musst du noch vorher mit einer gültigen Handle-Nummer füllen. D.h. du musst zuerst dein Fenster mit FindWindow_() finden und anschließend mit FindWindowEx_() deinen Button. (Falls du es noch nicht gemacht hast und es darf nicht 0 sein.)
Also etwa so:

Code: Alles auswählen

EnableExplicit

Define Handle

If OpenWindow(0, 0, 0, 500, 400, "abcdefghijklmnopqrstuvwxyz", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget(1, 10, 10, 100, 20, "Quellbutton", 0)
  ButtonGadget(2, 10, 40, 100, 20, "Zielbutton", 0)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            Handle = FindWindow_(0, "abcdefghijklmnopqrstuvwxyz")
            Handle = FindWindowEx_(Handle, 0, "Button", "Zielbutton")
            Debug Handle
            SendMessage_(Handle, #BM_CLICK, 0, 0)
          Case 2
            Debug "Buttonklick wurde erfolgreich simuliert."
        EndSelect
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
Du kannst dein Fenster auch mit EnumWindows_() finden.
Weitere Informationen siehe MSDN.

Der obere Code ist nur ein Beispiel. Den Code musst du natürlich anpassen, da ich deine Benutzeroberfläche deines Fensters nicht kenne.
Falls du nützliche Tools zum Finden von Fenstern, Controls, Klassennamen und Handle-Nummern brauchst, kannst du das oder das verwenden.

Re: Space Taste wurde gedrückt und Input senden an

Verfasst: 02.08.2016 22:17
von udg
Danke für die Hilfe. Ich habe dies jetzt ausgelesen:

Code: Alles auswählen

Title:	Sound Forge Pro 11.0 - [Hospital_Records_NHS292EP_City_Soul_EP_Hugh_Hardie_featuring_Silence_Groove_City_Soul_B2_Side.wav]
Class name:	Forge11MDIClass
Window handle:	1312816 (0x00140830)
Parent window:	0      (0x00000000)
Owner window:	0      (0x00000000)
Window ID:	27526371 (0x01A404E3)
Window proc:	0x00000000
Client coords:	x:   0 y:  25  w:1409 h: 748
Window coords:	x: 379 y:  27  w:1523 h: 996
die Window ID sollte doch die jenige sein die ich verwenden muss? Jedoch ändert sich diese bei jedem Neustart des Soundprogrammes

Code: Alles auswählen

If Event = #PB_Event_Gadget
     Select EventGadget()
       ;PLAY BTN send COMMAND SPACE already CLiCKED TO PLAY
        Case #PB_Event_Gadget
             EventGadget = EventGadget()
             EventType = EventType()
            
             If EventGadget = #Btn_play
               Handle = FindWindow_(27526371, "Forge11MDIClass")
               Handle = FindWindowEx_(Handle, #Btn_play, "Button", "play")
               SendMessage_(Handle, #BM_CLICK,  0, 0)
             EndIf
            
       ;EXIT BUTTON FUNCTION
        Case #Gadget_exit
             End
     EndSelect
  EndIf
Aber da mach ich doch noch was falsch.

Re: Space Taste wurde gedrückt und Input senden an

Verfasst: 02.08.2016 22:32
von RSBasic
Die Handlenummer (27526371) darfst du nicht direkt verwenden, da diese immer unterschiedlich ist, wie du bereits festgestellt hast. Außerdem wird diese Nummer erst nach dem Ausführen von FindWindow_() ermittelt anhand des Fenstertitels oder/und Klassennamens.
Die WinAPI-Funktion benutzt du leider falsch. Der erste Parameter ist lpClassName.
Dieser Parameter ist optional und wird nur benötigt, wenn du mit Hilfe eines Klassennamens nach einem bestimmten Fenster suchen möchtest.
Der zweite Parameter ist lpWindowName und wird verwendet, wenn du den Fenstertitel als Suche verwenden möchtest.
Beide Parameter kannst du verwenden, musst du aber nicht. Wenn nicht, dann übergebe einfach eine 0.

Dein folgender Code:

Code: Alles auswählen

Handle = FindWindow_(27526371, "Forge11MDIClass")
muss eigentlich so lauten:

Code: Alles auswählen

Handle = FindWindow_("Forge11MDIClass", 0)
Warum? In ShowWin hast du das Fenster korrekt ermittelt. Du siehst den Namen "Forge11MDIClass". Daneben steht aber "Class name". Deshalb musst du in diesem Fall den ersten Parameter (lpClassName) verwenden und nicht den zweiten, da der zweite Parameter für den Fenstertitel zuständig ist.
Liste und Beschreibung der einzelnen Parameter: https://msdn.microsoft.com/de-de/librar ... s.85).aspx

Ich hoffe, ich konnte dir weiterhelfen.

\\Edit:
Wenn du mit FindWindow_() nach "Forge11MDIClass" suchen möchtest, stelle aber sicher, dass dieses Fenster ein Hauptfenster ist. Falls das ein Unterfenster (MDI ist ein Unterfenster) ist, dann musst du zuerst das Hauptfenster ermitteln und anschließend mit FindWindowEx_() das Forge11MDIClass-Fenster.

Falls du nicht weiterkommen solltest, kann man das Soundprogramm irgendwo herunterladen? Dann kann ich für dich den API-Code schreiben, falls es zu kompliziert ist.

Re: Space Taste wurde gedrückt und Input senden an

Verfasst: 02.08.2016 22:45
von udg
:allright: dickes Danke mal wieder an dieser Stelle.

Leider übergibt es noch nicht aus meinem mini Tool, dass ich mit Drücken auf den Button in SoundForge das Play auslöse:

Code: Alles auswählen

Enumeration
  #Window_0
EndEnumeration

Enumeration
  #Btn_play
  #Exit_btn
  #Gadget_exit
EndEnumeration

Define.i Event, EventWindow, EventGadget, EventType, EventMenu
Define Handle

;DEFINIERE EXIT BUTTON: X
 CreateImage(#Exit_btn,30,30)
  StartDrawing(ImageOutput(#Exit_btn))
    FillArea(1,1,-1,RGB(55, 110, 133))
    Line(6,23,18,-18,$FFFFFF)
    Line(6,6,18,18,$FFFFFF)
  StopDrawing()
       
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 727, 371, 214, 119, " ", #PB_Window_BorderLess)
     ;ALWAYS ON TOP
     SetWindowPos_(WindowID(#Window_0),#HWND_TOPMOST,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE)
     ;PLAY BTN
     ButtonGadget(#Btn_play, 39, 37, 130, 45, "play")
     ;EXIT X
     ImageGadget(#Gadget_exit,WindowWidth(0)-31,1,30,30,ImageID(#Exit_btn))
  EndIf
EndProcedure

OpenWindow_Window_0()

Repeat
  Event = WaitWindowEvent()
  EventGadget = EventGadget()
  EventType = EventType()
  
  If Event = #PB_Event_Gadget
     Select EventGadget()
         
       ;PLAY BTN send COMMAND SPACE already CLiCKED TO PLAY
        Case #PB_Event_Gadget
             EventGadget = EventGadget()
             EventType = EventType()
            
             If EventGadget = #Btn_play
               Handle = FindWindow_("Forge11MDIClass", 0)
               Handle = FindWindowEx_(Handle, #Btn_play, "Button", "play")
               SendMessage_(Handle, #BM_CLICK,  0, 0)
             EndIf
            
       ;EXIT BUTTON FUNCTION
        Case #Gadget_exit
             End
     EndSelect
  EndIf
  
;DRAG PLAY WITH MOUSE  
  Select Event   
    Case #WM_LBUTTONDOWN   
         If WindowMouseX(#Window_0) >= 0 And WindowMouseX(#Window_0) <= 214 And WindowMouseY(#Window_0) >= 0 And WindowMouseY(#Window_0) <= 30
            SendMessage_(WindowID(#Window_0), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
         EndIf
    EndSelect
ForEver
worauf muss ich hier noch achten?

EDIT

ich habe das SoundForge11 gekauft. Ich hoffe, dass dieser Link funktioniert:
http://www.sonycreativesoftware.com/de/ ... ?id=9069.1

Re: Space Taste wurde gedrückt und Input senden an

Verfasst: 02.08.2016 23:01
von RSBasic
Ich habe die Testversion dieser Software heruntergeladen und installiert.
Kannst du für mich einen Screenshot erstellen und in einem Bildbearbeitungsprogramm den Button mit einem Pfeil markieren, der automatisiert gedrückt werden soll?
Dann weiß ich, welchen Button du meinst.

Re: Space Taste wurde gedrückt und Input senden an

Verfasst: 02.08.2016 23:11
von udg
:allright:

Bild

Re: Space Taste wurde gedrückt und Input senden an

Verfasst: 03.08.2016 00:13
von RSBasic
Danke für den Screenshot.
Leider hat man auf diesen Button keinen direkten Zugriff, da innerhalb des MDI-Fensters selbst gezeichnete Controls vorhanden sind bzw. keine echten WinAPI-Controls sind.
Wenn du beispielsweise das Programm "WinSpy" benutzt und versuchst, mit Hilfe des Window-Pickers auf den Button zu zeigen, dann wird nur das Unterfenster "FgMDIChildData" markiert, aber die anderen Elemente leider nicht.
Da diese Play-Funktion auch über das Menü (Transport > Play) erreichbar ist, kann man das Menü-Event ebenfalls auslösen:

Code: Alles auswählen

PostMessage_(Handle, #WM_COMMAND, MenuItemID, 0)
Die MenuItemID muss ich erst herausfinden. Aber erst morgen Abend habe ich wieder Zeit.