Windows 8.1 Bildschirmtastatur

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Windows 8.1 Bildschirmtastatur

Beitrag von Velindos »

Hallo RSBasic,
Danke für deinen Tip! Habe mir die Sache mit WinSpy angesehen, finden aber den Prozess/Class von "TapTip.exe" nicht!

Das mit der Klasse verstehe ich nur zum Teil, wenn ich in meinen Wordpad Beispiel nun die Klasse eintrage ist Wordpad nicht mehr im Fenster.

Code: Alles auswählen

#Window = 1
#Mode_Border = 22
#Mode_NoBorder = 23

Global hWd
Global ExtProg
Global hwnd_xyz
Global WindowX = 0
Global WindowY = 0
Global WindowW = 800
Global WindowH = 800

ExtProg = RunProgram("write.exe",Chr(34)+"C:\Users\Velindos\AppData\Local\Temp\DeinRTFText.rtf"+Chr(34),"",#PB_Program_Wait)
Delay(100)  ;!!!!
hwnd_xyz = FindWindow_(0, "WordPad") ; <<= WordPadClass

Global br = 600
Global hh = 600

hWd = OpenWindow(#Window, 60, 90, br, hh-25, "Test")
SetWindowLong_(WindowID(#Window), #GWL_STYLE, GetWindowLong_(WindowID(#Window), #GWL_STYLE) &~ #WS_DLGFRAME)

SetParent_(hwnd_xyz, WindowID(#Window))

;Titelzeile entfernen
style = GetWindowLongPtr_(hwnd_xyz, #GWL_STYLE)
style & ~#WS_CAPTION
;      SetWindowLong_(hwnd_xyz, #GWL_STYLE, style) 
SetWindowLong_(hwnd_xyz, #GWL_STYLE, GetWindowLong_(hwnd_xyz, #GWL_STYLE) &~ #WS_CAPTION)

SetWindowPos_(hwnd_xyz,0,0,0,br,hh-25,#SWP_SHOWWINDOW) 
; Windwos neu zeichnen
SmartWindowRefresh(#Window, 1)
; Windows im Vorderground
SetForegroundWindow_(hWd)     
; Aktives Windows
SetActiveWindow(#Window)

Repeat
     If FindWindow_(0, "WordPad")
          Debug "Write läuft"
     Else
          ; End ... geht nicht schaltet sofort aus
     EndIf
     
     Event = WaitWindowEvent(1)
     If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
          Quit = 1
     EndIf
Until Quit = 1
End
Hier wollte ich das Window schliessen wenn Wordpad geschlossen wird.

Gruss ... Velindos!
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Windows 8.1 Bildschirmtastatur

Beitrag von RSBasic »

Der Klassenname hat nichts mit dem Prozessname zu tun, sondern mit dem Fenster im Prozess.
Jedes Fenster hat einen Titel und einen Klassennamen. Da der Fenstertitel variable ist (z.B. "DeinRTFText.rtf - WordPad" oder ""DeinRTFText2.rtf - WordPad""), nimmt man lieber den Klassennamen zum Finden des gewünschten Fensters.
Du willst anscheinend WordPad in dein eigenes Fenster parent. Mit folgendem Code nach meiner Anpassung funktioniert bei mir das Einbinden eines externen Fensters:

Code: Alles auswählen

#Window = 1
#Mode_Border = 22
#Mode_NoBorder = 23

Global hWd
Global ExtProg
Global hwnd_xyz
Global WindowX = 0
Global WindowY = 0
Global WindowW = 800
Global WindowH = 800

ExtProg = RunProgram("write.exe",Chr(34)+"C:\Users\Velindos\AppData\Local\Temp\DeinRTFText.rtf"+Chr(34),"",#PB_Program_Wait)
Delay(500)  ;!!!!
hwnd_xyz = FindWindow_("WordPadClass", 0) ; <<= WordPadClass

Global br = 600
Global hh = 600

hWd = OpenWindow(#Window, 60, 90, br, hh-25, "Test")
SetWindowLong_(WindowID(#Window), #GWL_STYLE, GetWindowLong_(WindowID(#Window), #GWL_STYLE) &~ #WS_DLGFRAME)

SetParent_(hwnd_xyz, WindowID(#Window))

;Titelzeile entfernen
style = GetWindowLongPtr_(hwnd_xyz, #GWL_STYLE)
style & ~#WS_CAPTION
;      SetWindowLong_(hwnd_xyz, #GWL_STYLE, style)
SetWindowLong_(hwnd_xyz, #GWL_STYLE, GetWindowLong_(hwnd_xyz, #GWL_STYLE) &~ #WS_CAPTION)

SetWindowPos_(hwnd_xyz,0,0,0,br,hh-25,#SWP_SHOWWINDOW)
; Windwos neu zeichnen
SmartWindowRefresh(#Window, 1)
; Windows im Vorderground
SetForegroundWindow_(hWd)     
; Aktives Windows
SetActiveWindow(#Window)

Repeat
  If FindWindowEx_(WindowID(#Window), 0, "WordPadClass", 0)
    Debug "Write läuft"
  Else
    ; End ... geht nicht schaltet sofort aus
  EndIf
  
  Event = WaitWindowEvent(1)
  If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
    Quit = 1
  EndIf
Until Quit = 1
End
Warum es nach dem Einbinden die Funktion FindWindow_() in deiner Event-Schleife fehlschlägt, liegt daran, dass es kein eigenständiges Hauptfenster mehr ist, sondern ein Unterfenster deines eigenen Fensters.
Deshalb musst du folgendes ersetzen:

Code: Alles auswählen

If FindWindow_(0, "WordPad")
          Debug "Write läuft"
     Else
          ; End ... geht nicht schaltet sofort aus
     EndIf
>

Code: Alles auswählen

If FindWindowEx_(WindowID(#Window), 0, "WordPadClass", 0)
    Debug "Write läuft"
  Else
    ; End ... geht nicht schaltet sofort aus
  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
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Windows 8.1 Bildschirmtastatur

Beitrag von Velindos »

Hallo RSBasic,
Danke für deine Tips. Habe die Sache mal eingearbeitet in 3 Beispiele.

Beispiel 1: [Extern] WORDPAD im Window

Code: Alles auswählen

;- Externes WORDPAD Test 
Enumeration
     #Window
     #WordpadButton
EndEnumeration

Global Handle

Global wNd_PosX = 60
Global wNd_PosY = 90
Global wNd_GraphX = 1200
Global wNd_GraphY = 600

Procedure ExtWordPad()
     ; Aufruf über Explorer
     ; RunProgram("explorer.exe ",Chr(34)+"Z:\INFORMENT\Richtext\Asteroid 2016 TB57.rtf"+Chr(34),"",#PB_Program_Wait)
     ; Aufruf direkt über Programm
     RunProgram("WRITE.exe ",Chr(34)+"Z:\INFORMENT\Richtext\Asteroid 2016 TB57.rtf"+Chr(34),"",0);#PB_Program_Wait ist nicht notwendig
     Delay(1000)                                                                                 ;!!!! ;lieber 500 Millisekunden
     Handle = FindWindow_("WordPadClass", 0)
     Debug Handle
     SetParent_(Handle, WindowID(#Window))
     ;Titelzeile entfernen
     SetWindowLongPtr_(Handle, #GWL_STYLE, GetWindowLongPtr_(Handle, style) | #WS_DLGFRAME)
     SetWindowPos_(Handle,0,0,0,wNd_GraphX,wNd_GraphY,#SWP_SHOWWINDOW) 
     SmartWindowRefresh(#Window, 1)
     SetActiveWindow(#Window)
EndProcedure

OpenWindow(#Window,wNd_PosX , wNd_PosY, wNd_GraphX, wNd_GraphY, "Test" )
ButtonGadget(#WordpadButton,10,100,100,25,"WordPad")

Repeat
     
     If FindWindowEx_(WindowID(#Window), 0, "WordPadClass", 0)
          ; Debug "Write läuft"
     Else
          ; Jetzt Button Hiden
          HideGadget(#WordpadButton,0)
     EndIf
     
     Event = WaitWindowEvent(1)
     
     
     Select EventGadget()
          Case #PB_Event_Gadget
          Case #WordpadButton
               ; Jetzt Button Hiden
               HideGadget(#WordpadButton,1)
               ; Nun Procedure
               ExtWordPad()
     EndSelect
     
     If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
          Quit = 1
          MessageRequester("Meldung", "Beenden")    
     EndIf
Until Quit = 1
Startet ausserhalb des Fensters und dann erst als Parent. Zeigt immer eine leere Zeile im Head von Wordpad.

Beispiel 2:[Extern] NOTEPAD im Window

Code: Alles auswählen

;- Externes NotePad Test 
Enumeration
     #Window
     #NotePadButton
EndEnumeration

Global Handle

Global wNd_PosX = 60
Global wNd_PosY = 90
Global wNd_GraphX = 1200
Global wNd_GraphY = 600

Procedure ExtNotePad()
     ; Aufruf über Explorer
     RunProgram("explorer.exe ",Chr(34)+"Z:\INFORMENT\Flash\txt\Story.txt"+Chr(34),"",#PB_Program_Wait)
     ; Aufruf direkt über Programm
     ; RunProgram("Notepad.exe ",Chr(34)+"Z:\INFORMENT\Flash\txt\Story.txt"+Chr(34),"",0);#PB_Program_Wait ist nicht notwendig
     ;      Delay(1000);!!!! ;lieber 500 Millisekunden
     ;      RunProgram("Notepad.exe","","",#PB_Program_Hide)
     ; Handle = FindWindow_(0, "Story.txt - Editor")
     
     Delay(100)  ;!!!!
     Handle = FindWindow_(0, "Unbenannt - Editor"); Welche Class??
     
     Debug Handle
     SetParent_(Handle, WindowID(#Window))
     ;Titelzeile entfernen
     SetWindowLongPtr_(Handle, #GWL_STYLE, GetWindowLongPtr_(Handle, style) | #WS_DLGFRAME)
     SetWindowPos_(Handle,0,0,0,wNd_GraphX,wNd_GraphY,#SWP_SHOWWINDOW) 
     SmartWindowRefresh(#Window, 1)
     SetActiveWindow(#Window)
EndProcedure

OpenWindow(#Window,wNd_PosX , wNd_PosY, wNd_GraphX, wNd_GraphY, "Test" )
ButtonGadget(#NotePadButton,10,100,100,25,"NotePad")

Repeat
     
     If FindWindowEx_(WindowID(#Window), 0, "Unbenannt - Editor", 0)
          ; Debug "Write läuft"
     Else
          ; Jetzt Button Hiden
          HideGadget(#NotePadButton,0)
     EndIf
     
     Event = WaitWindowEvent(1)
     
     
     Select EventGadget()
          Case #PB_Event_Gadget
          Case #NotePadButton
               ; Jetzt Button Hiden
               HideGadget(#NotePadButton,1)
               ; Nun Procedure
               ExtNotePad()
     EndSelect
     
     If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
          Quit = 1
          MessageRequester("Meldung", "Beenden")    
     EndIf
Until Quit = 1
Notepad.exe findet man nicht als Window im WinSpy!

Wenn ich "Handle = FindWindow_(0, "Story.txt - Editor")" verwende, findet er ihn nicht!

Beispiel 3:[Extern] PHOTOFILTRE im Window

Code: Alles auswählen

;- Externes PhotoFiltre Test einbinden
;-  
; C:\Program Files (x86)\PhotoFiltre\PhotoFiltre.exe
; Z:\INFORMENT\Flash\png\selfhtml - Kopie.png

Enumeration
     #Window
     #PhotoFiltreButton
EndEnumeration

Global Handle

Global wNd_PosX = 60
Global wNd_PosY = 90
Global wNd_GraphX = 1200
Global wNd_GraphY = 600

Procedure ExtWordPad()
     ; Aufruf über Explorer
     RunProgram("explorer.exe ",Chr(34)+"Z:\INFORMENT\Flash\png\selfhtml - Kopie.png"+Chr(34),"",#PB_Program_Wait)
     ; Aufruf direkt über Programm
     ;    RunProgram("C:\Program Files (x86)\PhotoFiltre\PhotoFiltre.exe",Chr(34)+"Z:\INFORMENT\Flash\png\selfhtml - Kopie.png"+Chr(34),"",0);#PB_Program_Wait ist nicht notwendig
     Delay(1000)                                                                                 ;!!!! ;lieber 500 Millisekunden
     Handle = FindWindow_("TMainForm", 0)
     Debug Handle
     SetParent_(Handle, WindowID(#Window))
     ;Titelzeile entfernen
     SetWindowLongPtr_(Handle, #GWL_STYLE, GetWindowLongPtr_(Handle, style) | #WS_DLGFRAME)
     SetWindowPos_(Handle,0,0,0,wNd_GraphX,wNd_GraphY,#SWP_SHOWWINDOW) 
     SmartWindowRefresh(#Window, 1)
     SetActiveWindow(#Window)
EndProcedure

OpenWindow(#Window,wNd_PosX , wNd_PosY, wNd_GraphX, wNd_GraphY, "Test" )
ButtonGadget(#PhotoFiltreButton,10,100,100,25,"PhotoFiltre")

Repeat
     
     If FindWindowEx_(WindowID(#Window), 0, "TMainForm", 0)
          ; Debug "Write läuft"
     Else
          ; Jetzt Button Hiden
          HideGadget(#PhotoFiltreButton,0)
     EndIf
     
     Event = WaitWindowEvent(1)
     
     
     Select EventGadget()
          Case #PB_Event_Gadget
          Case #PhotoFiltreButton
               ; Jetzt Button Hiden
               HideGadget(#PhotoFiltreButton,1)
               ; Nun Procedure
               ExtWordPad()
     EndSelect
     
     If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
          Quit = 1
          MessageRequester("Meldung", "Beenden")    
     EndIf
Until Quit = 1
Hier ein Versuch mit einer Shareware die ich selbst ins Verzeichniss gebe:

[WinSpy]
TApplication
TMainForm

[Applikation]
Irgendwie fehlt CloseWindow_ weil die Proc weiterläuft! Gibt es da noch ein CloseWindow etc.

Gruss ... Velindos!
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Windows 8.1 Bildschirmtastatur

Beitrag von RSBasic »

Velindos hat geschrieben:Beispiel 2:[Extern] NOTEPAD im Window
Velindos hat geschrieben:Notepad.exe findet man nicht als Window im WinSpy!
Bild

Code: Alles auswählen

Handle = FindWindow_("Notepad", 0)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Windows 8.1 Bildschirmtastatur

Beitrag von Velindos »

Hallo RSBasic,
Danke für den TIP! Habe mir noch die TABTIP angesehen!

Beispiel 4:

Code: Alles auswählen

;- TapTip Example

; IPTIP_Main_Window

Enumeration
     #Window
     #TapTipPadButton
     #TapTipPadButton2
EndEnumeration

Global Handle

Global wNd_PosX = 60
Global wNd_PosY = 90
Global wNd_GraphX = 1200
Global wNd_GraphY = 600

Procedure TabTip()
     ; ExtProg = RunProgram("explorer.exe ",Chr(34)+"C:\Program Files\Common Files\microsoft shared\ink\TabTip.exe"+Chr(34),"",0);#PB_Program_Wait ist nicht notwendig
     RunProgram("C:\Program Files\Common Files\microsoft shared\ink\TabTip.exe", "/?", "",#PB_Program_Wait  );#PB_Program_Open
     Delay(500)                                                                                              ;!!!! ;lieber 500 Millisekunden                                                                          
     ; Handle = FindWindow_("#32770", 0)
     ;      Handle = FindWindow_("IPTIP_Main_Window", nil)                                                              ;
     Handle = FindWindow_("Shell_TrayWnd", null)
     Debug Handle
EndProcedure

Define ShellTrayWnd
Define TrayNotifyWnd

OpenWindow(#Window,wNd_PosX , wNd_PosY, wNd_GraphX, wNd_GraphY, "Test" )
ButtonGadget(#TapTipPadButton,10,100,100,25,"TapTip ON")
ButtonGadget(#TapTipPadButton2,10,150,100,25,"TapTip OFF")
HideGadget(#TapTipPadButton2,1)
Repeat
     
     Event = WaitWindowEvent(1)
     
     If FindWindowEx_(WindowID(#Window), 0, "Shell_TrayWnd", 0)
          Debug "Write läuft"
          HideGadget(#TapTipPadButton2,0)
     Else
          ; Jetzt Button Hiden
          HideGadget(#TapTipPadButton,0)
     EndIf
     
     Select EventGadget()
          Case #PB_Event_Gadget
          Case #TapTipPadButton
               ; Jetzt Button Hiden
               HideGadget(#TapTipPadButton,1)
               ; Nun Procedure
               TabTip()
               
          Case #TapTipPadButton2
               ; Lässt sich nicht abstellen
               SendMessage_(TabTip,#WM_CLOSE,0,0)
               ; PostMessage_(Handle,#WM_CLOSE,0,0)       
               
     EndSelect
     
     If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
          Quit = 1
          MessageRequester("Meldung", "Beenden")    
     EndIf
Until Quit = 1
Nun findet er Handl aber Irgentwie geht das wieder verloren, etc.!

Gruss ... Velindos!
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Windows 8.1 Bildschirmtastatur

Beitrag von RSBasic »

Was ist TabTip.exe genau? Laut Dateibeschreibung soll es eine Bildschirmtastatur sein, aber wenn ich es starte, beendet es sich gleich wieder.
Da kann ich dir leider nicht weiterhelfen, weil ich es nicht testen kann.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Windows 8.1 Bildschirmtastatur

Beitrag von mk-soft »

TabTip ist die Bildschirmtastatur von Windows.

Bei Windows 7 Pro öffnet sich diese und man kann die Tastatur zur Seite ausblenden.
Bei Windows 10 Pro liegt diese in dem Systray-Bereich und diese dann per Klick öffnen.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Windows 8.1 Bildschirmtastatur

Beitrag von RSBasic »

Du schreibst Windows 10 Pro. Ist diese Bildschirmtastatur in Windows 10 Home nicht verfügbar?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Windows 8.1 Bildschirmtastatur

Beitrag von mk-soft »

Habe ich gerade mal getestet.

Bei Windows 10 Home fehlt TapTip.exe

Es sollte doch eine Bildschirmtastatur dabei sein?!
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Windows 8.1 Bildschirmtastatur

Beitrag von Velindos »

Hallo Leute,

meines Wissens gibt es die

1) Bildschirmtastatur

RunProgram("osk.exe",Chr(34)+""+Chr(34),"",#PB_Program_Wait)

und die eine Tastur für die Tablett Eingabe. Nun, auf meinen Windows 10 Home Tablett, weisst Windows einen Tablett Modus und einen Desktop Modus auf. Erreichbar über das hereinziehen des rechten Menue.

Besonderheit ist, daß der Aufruf im Tablettmodus geht, aber nicht im Desktopmodus.

2) TabTip Tastatur

RunProgram("explorer.exe ",Chr(34)+"C:\Program Files\Common Files\microsoft shared\ink\TabTip.exe"+Chr(34),"",0)

Zu dem Thema fand ich nur einen Eintrag im Internet unter:

https://stackoverflow.com/questions/387 ... ry-edition

Gruss ... Velindos!
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Antworten