Beispielprogramm übergibt den Notepad nichts....

Für allgemeine Fragen zur Programmierung mit PureBasic.
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Beispielprogramm übergibt den Notepad nichts....

Beitrag von funkheld »

Hallo, dieses Demo läuft bei mir mit Purebasic 4.51.
Der Notepad wird gestartet, aber es tut sich nichts.
Warum.

gruss

Code: Alles auswählen

;SendKeys(handel,Window$,Keys$)  

;Handel ......... ist ein Handel zu einen Fenster bekommst du wenn du das Fenster erzeugst.  
;Window$ ........ Ist der Name des Fesnters, wenn du den Handel nicht kennst. In dem Fall gibt man dan Handel = 0 an.  
;Keys$ .......... Sind die Tasten die du schicken m chtest, wobei du Sondertasten in \{\} Einschliest (zb. \{CONTROLDOWN\})  

; SendKeys procedure by PB -- do whatever you want with it. :)  
; Syntax: r=SendKeys(handle,window$,keys$) ; r = 0 for failure.  
; Specify either a handle or window$ title to type to, but not both!  
; You cannot type curly braces \{ \} as part of the keystrokes, sorry!  
;  
Procedure SendKeys(handle,window$,keys$) 
If window$<>"" : handle=FindWindow_(0,window$) : EndIf ; Use window$ instead of handle.  
   If IsWindow_(handle)=0 ; Does the target window actually exist?  
      ProcedureReturn 0 ; Nope, so report 0 for failure to type.  
   Else  
   ; This block gives the target window the focus before typing.  
   thread1=GetWindowThreadProcessId_(GetForegroundWindow_(),0)  
   thread2=GetWindowThreadProcessId_(handle,0)  
   If thread1<>thread2 : AttachThreadInput_(thread1,thread2,#True) : EndIf  
      SetForegroundWindow_(handle) ; Target window now has the focus for typing.  
      Delay(125) ; 1/8 second pause before typing, to prevent fast CPU problems.  
      ; Now the actual typing starts.  
      For r=1 To Len(keys$)  
          vk$=Mid(keys$,r,1)  
          If vk$="\{" ; Special key found.  
             s=FindString(keys$,"\}",r+1)-(r+1) ; Get length of special key.  
             s$=Mid(keys$,r+1,s) ; Get special key name.  
             Select s$ ; Get virtual key code of special key.  
                Case "ALTDOWN" : keybd_event_(#VK_MENU,0,0,0) ; Hold ALT down.  
                Case "ALTUP" : keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0) ; Release ALT.  
                Case "BACKSPACE" : vk=#VK_BACK  
                Case "CONTROLDOWN" : keybd_event_(#VK_CONTROL,0,0,0) ; Hold CONTROL down.  
                Case "CONTROLUP" : keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0) ; Release CONTROL.  
                Case "DELETE" : vk=#VK_DELETE  
                Case "DOWN" : vk=#VK_DOWN  
                Case "END" : vk=#VK_END  
                Case "ENTER" : vk=#VK_RETURN  
                Case "F1" : vk=#VK_F1  
                Case "F2" : vk=#VK_F2  
                Case "F3" : vk=#VK_F3  
                Case "F4" : vk=#VK_F4  
                Case "F5" : vk=#VK_F5  
                Case "F6" : vk=#VK_F6  
                Case "F7" : vk=#VK_F7  
                Case "F8" : vk=#VK_F8  
                Case "F9" : vk=#VK_F9  
                Case "F10" : vk=#VK_F10  
                Case "F11" : vk=#VK_F11  
                Case "F12" : vk=#VK_F12  
                Case "ESCAPE" : vk=#VK_ESCAPE  
                Case "HOME" : vk=#VK_HOME  
                Case "INSERT" : vk=#VK_INSERT  
                Case "LEFT" : vk=#VK_LEFT  
                Case "PAGEDOWN" : vk=#VK_NEXT  
                Case "PAGEUP" : vk=#VK_PRIOR  
                Case "PRINTSCREEN" : vk=#VK_SNAPSHOT  
                Case "RETURN" : vk=#VK_RETURN  
                Case "RIGHT" : vk=#VK_RIGHT  
                Case "SHIFTDOWN" : shifted=1 : keybd_event_(#VK_SHIFT,0,0,0) ; Hold SHIFT down.  
                Case "SHIFTUP" : shifted=0 : keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) ; Release SHIFT.  
                Case "TAB" : vk=#VK_TAB  
                Case "UP" : vk=#VK_UP  
             EndSelect  
             If Left(s$,3)<>"ALT" And Left(s$,7)<>"CONTROL" And Left(s$,5)<>"SHIFT"  
                keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0) ; Press the special key.  
             EndIf  
             r=r+s+1 ; Continue getting the keystrokes that follow the special key.  
          Else  
             vk=VkKeyScanEx_(Asc(vk$),GetKeyboardLayout_(0)) ; Normal key found.  
             If vk>304 And shifted=0 : keybd_event_(#VK_SHIFT,0,0,0) : EndIf ; Due to shifted character.  
             keybd_event_(vk,0,0,0) : keybd_event_(vk,0,#KEYEVENTF_KEYUP,0) ; Press the normal key.  
             If vk>304 And shifted=0 : keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) : EndIf ; Due to shifted character.  
          EndIf  
      Next  
      If thread1<>thread2 : AttachThreadInput_(thread1,thread2,#False) : EndIf ; Finished typing to target window!  
      keybd_event_(#VK_MENU,0,#KEYEVENTF_KEYUP,0) ; Release ALT key if user forgot.  
      keybd_event_(#VK_CONTROL,0,#KEYEVENTF_KEYUP,0) ; Release CONTROL key if user forgot.  
      keybd_event_(#VK_SHIFT,0,#KEYEVENTF_KEYUP,0) ; Release SHIFT key if user forgot.  
      ProcedureReturn 1 ; Report successful typing! :)  
   EndIf  
EndProcedure  
;  
m$= "This example types some text to Notepad, then clears and closes it."+Chr(13)  
m$=m$+"Open a new Notepad window, then click the OK button and watch! :)"  
MessageRequester("SendKeys example",m$,#MB_ICONINFORMATION)  
;  
RunProgram("d:\\purebasic\\notepad.exe","","",0)  
w$="Untitled - Notepad" ; Specifies target window name.  
Delay(1000) : SendKeys(0,w$,"This is a test!") ; Type some dummy text.  
Delay(1000) : SendKeys(0,w$,"\{CONTROLDOWN\}a\{CONTROLUP\}") ; Select it all.  
Delay(1000) : SendKeys(0,w$,"\{DELETE\}")      ; Delete it.  
 
Delay(1000) : SendKeys(0,w$,"\{CONTROLDOWN\}p\{CONTROLUP\}")  
 

Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Beispielprogramm übergibt den Notepad nichts....

Beitrag von STARGÅTE »

Vermutlich weil du eine deutsche "Notepad" Version hast und dein Fenster somit nicht "Untitled - Notepad" sonden:
"Unbenannt - Editor"

Außerdem musst du vermutlich den Pfad anpassen, außer "dein" Notepad ist wirklich in D:\PureBasic\ ^^
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: Beispielprogramm übergibt den Notepad nichts....

Beitrag von Bisonte »

Deutsches WIndows ?

Dann steht da als Fenstertitel bestimmt nicht "Untitled - Notepad" sondern "Unbekannt ...." oder so ähnlich.
Da wird das Fenster anhand des Namens ermittelt und der muss exakt übereinstimmen (CaseSensitiv)

Edit : Mist ... 16 Sekunden zu spät ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: Beispielprogramm übergibt den Notepad nichts....

Beitrag von funkheld »

Oh..., danke.

Dieser Tastencode wird nur gedruckt in den Editor, führt aber keine Funktion aus,
oder soll der Code keine Funktion durchführen im Editor?
Delay(1000) : SendKeys(0,w$,"\{CONTROLDOWN\}a\{CONTROLUP\}")
Delay(1000) : SendKeys(0,w$,"\{DELETE\}")
Delay(1000) : SendKeys(0,w$,"\{CONTROLDOWN\}p\{CONTROLUP\}")
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Beispielprogramm übergibt den Notepad nichts....

Beitrag von STARGÅTE »

der Code erscheint mir etwas Falsch zu sein:

Code: Alles auswählen

vk$=Mid(keys$,r,1)  
If vk$="\{" ; Special key found.  
Wie soll an dieser Stelle je ein wahres Ergebnis kommen.
Schließlich sind in PB "\{" zwei Zeichen weil "\" kein Escape-Zeichen ist, wie woanders.

Da ja auch der Pfad so "komisch" war, vermute ich du hast den Code, irgendwie falsch kopiert!
Wenn du aus allen \{ \} \\ das { } \ gemacht werden, funktiert alles.
Dann funktioniert das auch mit den Sondertasten.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: Beispielprogramm übergibt den Notepad nichts....

Beitrag von funkheld »

Habe ich von hier :
http://www.purearea.net/pb/german/index.htm

Da der Code jetzt ohne Fehlermeldung läuft, war ich zufrieden...
Wahrscheinlich ist das ein Code-Editor mit Steuerzeichen.

gruss
Antworten