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

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

Beitrag von udg »

RSBasic hat geschrieben: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.
das habe ich auch versucht :) da ich dachte, hey, da kann man den PlayButton abgreifen. Leider zeigte es nix an wie du schon sagst.

PS.
Über das (Transport > play) wird die Space Taste nicht sofort und direkt angesprochen. Dazu muss man erst das Transport explizit anklicken um dann das Space Tasten Event nutzen zu können. Umständlich und braucht man nicht wirklich, da es ja mit der unteren Play Taste schon so funktioniert, siehe Screenshot.

Damit man mit der Space Taste abspielen kann, muss ein Zb. *.wav geladen sein. Dann mit der Maus in die wave-form klicken. Nun kann durch drücken der Space Taste, abgespielt werden. Space funktioniert also erst, wenn man mit der Maus in die geladene wave-form klickt.

Vielen Dank bis dahin. Ich spendier dir wieder ein Eis :)
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 konnte nun die MenuItemID herausfinden. Der Menüeintrag "Transport > Play" hat die ID 32402. Dieses Event kann ich simulieren.
Problem ist aber, dass der geladene Sound nur dann wiedergegeben wird, wenn das Fenster den Fokus hat. Das Menü-Event kann i.d.R. zwar problemlos direkt ausgelöst werden, auch wenn das Fenster keinen Fokus hat, aber diese Play-Funktion funktioniert leider trotzdem nur, wenn das Fenster vorher den Fokus hat.

Alternativ könnte man kurzzeitig den Fokus auf das Programmfenster legen. Dann kann man auch gleich die Space-Taste simulieren, ohne auf den Menüeintrag zugreifen zu müssen, da das sowieso ohne Fokus nicht funktioniert:

Code: Alles auswählen

EnableExplicit

Define Handle

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget(1, 10, 10, 100, 20, "Play", 0)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            Handle = FindWindow_("Forge11MDIClass", 0)
            If Handle
              SetForegroundWindow_(Handle)
              
              keybd_event_(#VK_SPACE, #Null, #Null, #Null)
              keybd_event_(#VK_SPACE, #Null, #KEYEVENTF_KEYUP, #Null)
              
              Delay(100)
              SetForegroundWindow_(WindowID(0));Dein Fenster
            EndIf
        EndSelect
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
Ich hoffe, der Code funktioniert bei dir auch.
Leider gibt es keine bessere Lösung. Ohne Fokuswechsel ist anscheinend nicht möglich, da das Programm der Meinung ist, den geladenen Sound nicht abspielen zu müssen.
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 »

Oh man, was für ein Kampf. Aber jetzt funktioniert es so wie es soll. Vielen vielen Dank für deine Hilfe.
Ich werde das Ganze noch designerisch gestalten ;) , dass es ein Transport Kontroller wird, als ob er schon immer dazu gehört ;)
Werde noch einen Stopp Button neben den Play Button setzen und mir dann Gedanken machen wie ich das Transport Fenster am Besten mit Soundforge zusammen Starte. Warscheinlich über eine simple Batch.

Muss nur noch schauen wie ich ein gefülltes Dreieck als PlayButton direkt zeichnen kann damit ich keine Grafik als PLayButton laden muss.
Gibt es da ein Beispiel?

Hier ist jetzt mein angepasster Code aus deinem Werk.

Code: Alles auswählen

Enumeration
  #Window_0
EndEnumeration

Enumeration
  #Btn_play
  #Btn_stop
  #Exit_btn
  #Gadget_exit
EndEnumeration

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

;DEFINIERE EXIT BUTTON: X
 CreateImage(#Exit_btn,15,15)
  StartDrawing(ImageOutput(#Exit_btn))
    FillArea(1,1,-1,RGB(202, 139, 133))
    Line(3,11,9,-9,$FFFFFF)
    Line(3,3,9,9,$FFFFFF)
  StopDrawing()
       
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 727, 371, 254, 119, " ", #PB_Window_BorderLess)
    ;1px thin window frame
     SetWindowLongPtr_(WindowID(#Window_0),#GWL_STYLE,GetWindowLongPtr_(WindowID(0),#GWL_STYLE)|#WS_BORDER)
     SetWindowPos_(WindowID(#Window_0), 0,0,0,0,0,#SWP_NOSIZE|#SWP_NOMOVE|#SWP_NOZORDER|#SWP_FRAMECHANGED) 
    ;ALWAYS ON TOP
     SetWindowPos_(WindowID(#Window_0),#HWND_TOPMOST,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE)
    ;PLAY BTN
     ButtonGadget(#Btn_play, 20, 28, 70, 70, "play")
    ;STOPP BTN
     ButtonGadget(#Btn_stop, 120, 28, 70, 70, "stop")
    ;EXIT X
     ImageGadget(#Gadget_exit,WindowWidth(0)-16,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 PUSHED TO PLAY
        Case #Btn_play
            Handle = FindWindow_("Forge11MDIClass", 0)
            If Handle
              SetForegroundWindow_(Handle)
             
              keybd_event_(#VK_SPACE, #Null, #Null, #Null)
              keybd_event_(#VK_SPACE, #Null, #KEYEVENTF_KEYUP, #Null)
             
              Delay(100)
              SetForegroundWindow_(WindowID(#Window_0));Dein Fenster
            EndIf
            
       ;STOPP BTN send COMMAND SPACE already PUSHED TO STOP
        Case #Btn_stop
            Handle = FindWindow_("Forge11MDIClass", 0)
            If Handle
              SetForegroundWindow_(Handle)
             
              keybd_event_(#VK_SPACE, #Null, #Null, #Null)
              keybd_event_(#VK_SPACE, #Null, #KEYEVENTF_KEYUP, #Null)
             
              Delay(100)
              
            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) <= 240 And WindowMouseY(#Window_0) >= 0 And WindowMouseY(#Window_0) <= 119
            SendMessage_(WindowID(#Window_0), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
         EndIf
    EndSelect
ForEver
Noch eine weitere Frage. Wozu braucht es das: Delay(100)
und wofür steht in deinem Code die: ,0 hinter der Button Deklarierung?

Code: Alles auswählen

ButtonGadget(1, 10, 10, 100, 20, "Play", 0)
denn es geht auch ohne dem.
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 »

udg hat geschrieben:Noch eine weitere Frage. Wozu braucht es das: Delay(100)
Ich habe ein Delay deshalb eingebaut, um dem Soundprogramm genügend Fokuszeit zu geben. Sonst ist er wieder der Meinung, er müsste den Sound nicht wiedergeben, weil er keinen Fensterfokus mehr hat.
udg hat geschrieben:und wofür steht in deinem Code die: ,0 hinter der Button Deklarierung?

Code: Alles auswählen

ButtonGadget(1, 10, 10, 100, 20, "Play", 0)
denn es geht auch ohne dem.
Jupp, es ist reine Gewohnheit. Man kann diesen optionalen Flag-Parameter auch weglassen. :)
udg hat geschrieben:Muss nur noch schauen wie ich ein gefülltes Dreieck als PlayButton direkt zeichnen kann damit ich keine Grafik als PLayButton laden muss.
Gibt es da ein Beispiel?
Es gibt bestimmt eine Möglichkeit, mit Hilfe eines Callbacks in den Button zu zeichnen, aber der Aufwand wäre etwas größer.
Du kannst auch z.B. diesen Code verwenden: http://www.rsbasic.de/aktualisierung/wi ... %20Icon.pb
Damit kannst du ein beliebiges Icon im Button darstellen.
Falls dein Compiler bei dir meckert, dass die Struktur "BUTTON_IMAGELIST" bereits deklariert ist, dann diese einfach entfernen.

Ansonsten kannst du auch einfach ein ButtonImageGadget() benutzen und mit CreateImage und StartDrawing() dein Dreieck mit Text zeichnen.
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 »

Ok. Alles geklärt und verstanden. Die Symbole für die Buttons werd ich per Draw realisieren. Möchte keine System buttons verwenden.
Wenn es fertig ist sollte man das Transport Tool mal an Sony schicken :mrgreen:

Wenn ich alles fertig habe poste ich nochmal das Endergebnis.
:allright:
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
udg
Beiträge: 568
Registriert: 20.06.2013 23:27

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

Beitrag von udg »

@ RSBasic

ich habe noch einmal eine Frage im Bezug auf das Transportfenster. Kann man die aktuelle Play-Curser Positionszeit, siehe Bild in das Transportfenster portieren und sich diese dort auch anzeigen lassen, eine Idee?

schau mal hier:
Bild

Grüße
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 »

Was meinst du genau? Möchtest du den Wiedergabecursor setzen oder ermitteln?
Falls ersteres:

Code: Alles auswählen

EnableExplicit

Define Handle
Define Edit_Handle
Define Button_Handle
Define GoToWindow_Handle

Define NewPosition$ = "00:00:10:00"

Procedure EnumChildProc(hwnd, lParam)
  Protected WindowText$
  Protected ClassName$
  
  If GetWindowLongPtr_(hwnd, #GWL_STYLE) & #WS_VISIBLE
    WindowText$ = Space(250)
    ClassName$ = Space(1024)
    GetWindowText_(hwnd, @WindowText$, 250)
    GetClassName_(hwnd, @ClassName$, Len(ClassName$))
    
    If Mid(WindowText$, 1, 8) = "Go To - " And ClassName$ = "#32770"
      PokeI(lParam, hwnd)
      ProcedureReturn #False
    EndIf
  EndIf
  
  ProcedureReturn #True
EndProcedure

Handle = FindWindow_("Forge11MDIClass", 0)
If Handle
  PostMessage_(Handle, #WM_COMMAND, 32227, 0)
  EnumChildWindows_(FindWindow_("ToolbarWindow32", 0), @EnumChildProc(), @GoToWindow_Handle)
  Edit_Handle = FindWindowEx_(GoToWindow_Handle, 0, "Edit", 0)
  Button_Handle = FindWindowEx_(GoToWindow_Handle, 0, "Button", "OK")
  SetForegroundWindow_(Edit_Handle)
  SendMessage_(Edit_Handle, #EM_REPLACESEL, 0, @NewPosition$)
  SendMessage_(Button_Handle, #BM_CLICK, 0, 0)
  
  ;SetForegroundWindow_(WindowID(#DeinFenster))
  
  
EndIf
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 »

Wow, so viel sollte es gar nicht sein.

was ich meinte, ich möchte die Spielzeit die unten rechts, siehe Bild während der Wiedergabe mitläuft (das ist immer die aktuelle Position des Play Cursors) in meinem Transportfenster anzeigen und dort mitlaufen lassen.
zb an dieser Position im Transportfenster:
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 »

Okay, schau ich heute Abend nochmal an.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
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 »

Sorry, ich konnte es nicht auslesen. Ich habe mit verschiedenen Codes (#SB_GETTEXT, GetWindowText_(), #WM_GETTEXT, ...) ausprobiert, aber keine Chance.
Nicht mal mit diesem Code lässt sich der Inhalt auslesen.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten