Seite 2 von 3

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

Verfasst: 03.08.2016 00:17
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 :)

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

Verfasst: 03.08.2016 10:05
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.

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

Verfasst: 03.08.2016 18:18
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.

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

Verfasst: 03.08.2016 19:18
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.

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

Verfasst: 03.08.2016 19:45
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:

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

Verfasst: 04.08.2016 22:11
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

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

Verfasst: 04.08.2016 23:17
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

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

Verfasst: 05.08.2016 02:23
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

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

Verfasst: 05.08.2016 09:42
von RSBasic
Okay, schau ich heute Abend nochmal an.

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

Verfasst: 05.08.2016 21:16
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.