Space Taste wurde gedrückt und Input senden an

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
udg
Beiträge: 568
Registriert: 20.06.2013 23:27

Space Taste wurde gedrückt und Input senden an

Beitrag 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
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

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

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
udg
Beiträge: 568
Registriert: 20.06.2013 23:27

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

Beitrag 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.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

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

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
udg
Beiträge: 568
Registriert: 20.06.2013 23:27

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

Beitrag 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.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

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

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
udg
Beiträge: 568
Registriert: 20.06.2013 23:27

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

Beitrag 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
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

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

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
udg
Beiträge: 568
Registriert: 20.06.2013 23:27

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

Beitrag von udg »

:allright:

Bild
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

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

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten