Page 1 sur 1

help svp problème simuler appuie touches avec blocage window

Publié : ven. 17/févr./2012 11:20
par david
je veux simuler l'appuie de touches (genre TAB et ENTER) pour prendre les commandes d'une autre fenêtre. Je l'ai déjà fait par le passé avec le programme suivant :

Code : Tout sélectionner

Declare  SendKeys(handle,window$,keys$)
w$="titre de la fenetre qui a le focus"
SendKeys(0,w$,"{TAB}"):SendKeys(0,w$,"{ENTER}")

; ****************************************************************************************
; ************************ PROCEDURE ****************************************************
; ****************************************************************************************
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 
le pb c'est que je veux paramétrer automatiquement l'imprimante (emulation des touches nécessaires pour modifier les options et simuler ENTREE pour valider mon choix)
apparament la fenetre qui apparait est "blocante" ce n'est qu'après sa fermeture que mon programme continue. voir exemple :

Code : Tout sélectionner

If PrintRequester()
Delay(1500)
MessageRequester("hh","hhh"+valeur2$)
EndIf
comment empecher la fenetre "Imprimer" de me bloquer??? je veux faire TAB... dans cette fenetre pour aller sur "Options d'impression" et modifier automatiquement..

Si c'est pas faisable comme ça, comment modifier les paramètres imprimante avec PB
sachant que je ne dispose pas des droits ADMIN sur le PC

Re: help svp problème simuler appuie touches avec blocage wi

Publié : ven. 17/févr./2012 11:26
par Ar-S
Ta fenêtre "d'imprimante" doit avoir son propre handle. Il faut donc à mon avis que tu envois les SendKey nécessaires dans cette fenêtre aussi.

Re: help svp problème simuler appuie touches avec blocage wi

Publié : ven. 17/févr./2012 11:39
par david
pourtant la procédure semble aller s'approprier le handle en question de la fenêtre active??
je ne la maitrise pas vraiment. c'était l'exemple pb pour modifier notepad.

je pense n'ayant pas de droits admin... sur le PC que je serais obligé de passer par cette fenetre pour modifier les parametres.

malheureusement, mon exemple2 avec messagerequester montre que mon programme PB est lui meme bloque par windows puisqu'il ne reprend que lorsque je ferme la fenetre

Re: help svp problème simuler appuie touches avec blocage wi

Publié : ven. 17/févr./2012 12:41
par david
Si je lance avec l'editeur PB le prog1:

Code : Tout sélectionner

If PrintRequester()
EndIf
Je laisse ouvert mais lance le prog2:

Code : Tout sélectionner

Declare  SendKeys(handle,window$,keys$)
w$="Imprimer"
Delay(1000) : SendKeys(0,w$,"{TAB}"):SendKeys(0,w$,"{TAB}"):SendKeys(0,w$,"{ENTER}")
ça marche??!!

Re: help svp problème simuler appuie touches avec blocage wi

Publié : ven. 17/févr./2012 13:11
par Ar-S
Mais pourquoi dois tu utiliser PrinterRequester() ?
DefaultPrinter() ne suffirait pas ?

Re: help svp problème simuler appuie touches avec blocage wi

Publié : ven. 17/févr./2012 13:35
par david
je ne veux pas changer d'imprimante.
Je veux aller dans Préférences pour mettre automatiquement en RECTO Simple ou en RECTO/VERSO, je ne trouve pas comment le faire sans passer par cette boite de dialogue

Re: help svp problème simuler appuie touches avec blocage wi

Publié : ven. 17/févr./2012 15:16
par Ar-S
david a écrit :je ne veux pas changer d'imprimante.
Je veux aller dans Préférences pour mettre automatiquement en RECTO Simple ou en RECTO/VERSO, je ne trouve pas comment le faire sans passer par cette boite de dialogue
Ah Ok je comprends.

Dans tous les cas, ça va faire moche que la fenêtre d'impression s'ouvre puis ouvre la fenêtre pref puis coche une option ou une autre etc..
(ça compter que ça va pas être facile à faire).

Je m'orienterai différemment.
Je me dis qu'il faudrait que tu vois si le fait de modifier recto/verso change quelque chose dans la base de registre ou dans un fichier .ini de ton logiciel d'impression. il serait ainsi plus facile de gérer tes impressions sans avoir à bidouiller cette fenêtre.

Re: help svp problème simuler appuie touches avec blocage wi

Publié : ven. 17/févr./2012 16:26
par kernadec
salut David
regarde cette lib et cherche le mode "duplex"

http://www.purearea.net/pb/download/use ... 07_PB4.ZIP

Cordialement