Rebondissement sur sujet SendMessage_

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Rebondissement sur sujet SendMessage_

Message par Ekim »

Bonjours à tous et plus particulièrement à @Falsam

j'ai donc cherché et trouvé quelques exemples sur le topic "SendMessage_"
https://www.purebasic.fr/french/viewtop ... e_#p171415

mais malheureusement, ceux ci ne résorbent mon problème

car dans mon cas, j'aimerais créer un système d'automation entre mon appli créer via PB et un logiciel professionnel (en 32bit) de gestion de stock
sauf que se dernier est en fenêtre type "console" :

exemple copie texte écran

Réception Commande XXXXXXX Stock Expédition Travaux Administration
XXXXXXXXX detail_ligne XXXXXX - Detail ligne - XX/XX/XXXXX
( Produit : 03591XXX
( 190G XXX XXXXX XXXXXXXX
( Réf. externe : XX 03591XXX
( Anomalie : NON
( Numéro de lot :
( XXXX : XXXXXXXXXXXXXXXXXX
( Poids net US : 0,000
( Blocage :
( Réservation : █
( Support :
( DATE gestion :
( Ann Four.: 0 Nb Pièce Four.: 0,0
( Qté Vrac : 40 Qté UM : X,0 Qté Support : 0,0
( Qté Bdl : 40 Pds Bdl: X,600 Qté Constatée : 0
(
( < Ok >
(
5999999999999999999999999999999999999999999999999999999999999N
(
( < OK > < Detail >
5999999999999999999999999999999999999999999999999999999999999N


il y a un curseur (pavé noir), pour la saisie et qu'on peut le déplacer via les touches Enter et flèches, et F2 pour la validation de la saisie
la touche Tab me permet d'atteindre les commandes "< OK >" et "< Detail >"

Alors ma 1ere question est, peut on récupérer le "Handle" d'une appli déjà en cours d'éxecution?

puis la 2eme, peut interagir avec une appli dont le type est "console"?



j'attends vos réponses avec impatience :D
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Re: Rebondissement sur sujet SendMessage_

Message par Shadow »

Salut, essaie ça pour récupérer ton Handle, sinon fais une recherche.
https://www.purebasic.fr/french/viewtop ... +le+Handle
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Re: Rebondissement sur sujet SendMessage_

Message par Ekim »

Salut @Shadow

merci pour le conseil mais une fois le Handle récupéré, je pourrais capturer et coller du texte ou voir même simuler la touche Tab et Enter?
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Rebondissement sur sujet SendMessage_

Message par falsam »

Hello Ekim effectivement prendre le handle de la fenetre console et faire un SendMessage() ne fonctionne pas.

je te propose d'utiliser la procédure de ebs sur le forum Anglophone
:arrow: https://www.purebasic.fr/english/viewto ... 486#p31486

J'ai fait un test. Ca à l'air de fonctionner.

Le code console de test.

Code : Tout sélectionner

OpenConsole("Mon Application", #PB_UTF8)

EnableGraphicalConsole(1)

Repeat
  
  ClearConsole()
  
  ConsoleLocate(5, 5) :: Print("Produit  : ")
  ConsoleLocate(5, 7) :: Print("Quantité : ")
  
  ConsoleLocate(17, 5) :: produit$ = Input()
  ConsoleLocate(17, 7) :: qte$ = Input()
  
  ConsoleLocate(5, 10) :: Print("Validation : " + produit$ + " - " + qte$ )
  
  ConsoleLocate(0, 0) :: Input()  
ForEver 
l'objectif avec le code de pilotage que je te propose sera de :
Localiser l'application console en espérant que tu as un titre.

Code : Tout sélectionner

hconsole = FindWindow_(0, "Mon Application")
puis faire un focus sur l'application

Code : Tout sélectionner

SetForegroundWindow_(hconsole)
et enfin envoyer des données à cette application console.

Code : Tout sélectionner

; send the specified key
; Source https://www.purebasic.fr/english/viewtopic.php?p=31486#p31486
Procedure SendKey(Key.s)
  ; get virtual key code and shift state
  VK.w = VkKeyScan_(Asc(Key))
  If VK = -1
    ProcedureReturn
  EndIf
  
  ; get scan code if an extended key
  If MapVirtualKey_(VK, 2) = 0
    Extended.l = #KEYEVENTF_EXTENDEDKEY
    ; get scan code
    Scan.l = MapVirtualKey_(VK, 0)
  Else
    Extended = 0
    Scan = 0
  EndIf
  
  ; press shift/ctrl/alt if needed
  Shift.l = VK & $100
  Ctrl.l = VK & $200
  Alt.l = VK & $400
  
  If Shift
    keybd_event_(#VK_SHIFT, 0, 0, 0)
  EndIf
  If Ctrl
    keybd_event_(#VK_CONTROL, 0, 0, 0)
  EndIf
  If Alt
    keybd_event_(#VK_MENU, 0, 0, 0)
  EndIf
  
  ; press and release key
  VK & $ff
  keybd_event_(VK, Scan, Extended, 0)
  keybd_event_(VK, Scan, #KEYEVENTF_KEYUP | Extended, 0)
  
  ; release shift/ctrl/alt if pressed
  If Shift
    keybd_event_(#VK_SHIFT, 0, #KEYEVENTF_KEYUP, 0)
  EndIf
  If Ctrl
    keybd_event_(#VK_CONTROL, 0, #KEYEVENTF_KEYUP, 0)
  EndIf
  If Alt
    keybd_event_(#VK_MENU, 0, #KEYEVENTF_KEYUP, 0)
  EndIf
EndProcedure

; send string to foreground application 
Procedure SendKeys(String.s)
  For Letter.l = 1 To Len(String)
    SendKey(Mid(String, Letter, 1))
  Next
EndProcedure

; Test

; Recherche du programme console a l'aide du titre de la fenetre  
hconsole = FindWindow_(0, "Mon Application")

If hconsole
  ; Prendre le focus de l'application console
  SetForegroundWindow_(hconsole)
    
  ; Enregistrement 1er produit
  produit$ = "Licence PureBasic"
  qte$ = "10"
  
  SendKeys(produit$) :: SendKeys(#CR$) 
  SendKeys(qte$) :: SendKeys(#CR$)
  
  ; Pour voir l'affichage du produit sur la console (pas obligatoire)
  Delay(3000)
  SendKeys(#CR$) 
  
  ; Enregistrement 2eme produit
  produit$ = "Licence SpiderBasic"
  qte$ = "20"
  
  SendKeys(produit$) :: SendKeys(#CR$) 
  SendKeys(qte$) :: SendKeys(#CR$)
  
  Delay(3000)
  SendKeys(#CR$) 
EndIf 
Une autre source pour envoyer des données à une application console sur ce lien.
:arrow: http://forums.purebasic.com/english/vie ... 6cd#p12777
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Re: Rebondissement sur sujet SendMessage_

Message par Ekim »

Merci @falsam pour ta réponse

sa à l'air cool ton exemple :D

mais je vais quand même concevoir un petit interface utilisateur pour les commande avant mon 1er test dans la boîte :P puis je te ferais un retour dès que possible

en espérant que les antivirus de la société ne bloquent pas tout le système :lol:

encore merci :wink:
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Re: Rebondissement sur sujet SendMessage_

Message par Patrick88 »

si tu as des problème avec les antivirus, essaie ces astuces
le problème avec PB est qu'un programme de faible taille à une signature qui ressemble à celle de trojan.
En ajoutant la taille du code, et donc en gonflant la taille de l'exe, la signature change et le programme ne passe plus pour un trojan.
Enfin, c'était le cas, si les antivirus ne font plus de fausse détection comme j'ai pu le voir dernièrement. J'ai résolu plein de fausse détection en ajoutant du code qui ne servait à rien, voir en changeant l'ordre de certaine partie du programme. Ca donne une bonne idée de l'efficacité d'un antivirus, non
voir le post https://www.purebasic.fr/french/viewtop ... us#p133494

Pat
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Rebondissement sur sujet SendMessage_

Message par Ollivier »

Si c'est toujours la même logique, c'est bien de la grosse merde ces anti-virus !
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Re: Rebondissement sur sujet SendMessage_

Message par Ekim »

@Patrick88, je pourrais par exemple inclure des image HD sans pour autant les utiliser))

@falsam, je reviens vers toi concernant l'appli mode console du taff, j'ai oublié d'apporter une précision de taille je pense,
le curseur se déplace différemment selon l'affichage entre autre, avec les touches fléchés
Dernière modification par Ekim le jeu. 02/juil./2020 21:41, modifié 1 fois.
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Re: Rebondissement sur sujet SendMessage_

Message par Ekim »

@falsam, j'ai donc effectué une tentative d'intégration de ton bout de code dans mon petit projet, mais cela c'est avéré infructueuse :oops:

mon très très faible niveau de débutant y est certainement pour quelques chose :oops:

notamment cette inscription "::" m’interpelle :lol:

bref, je suis largué :?

Code : Tout sélectionner


Procedure SendKey(Key.s)
	; get virtual key code and shift state
	VK.w = VkKeyScan_(Asc(Key))
	If VK = -1
		ProcedureReturn
	EndIf
	
	; get scan code if an extended key
	If MapVirtualKey_(VK, 2) = 0
		Extended.l = #KEYEVENTF_EXTENDEDKEY
		; get scan code
		Scan.l = MapVirtualKey_(VK, 0)
	Else
		Extended = 0
		Scan = 0
	EndIf
	
	; press shift/ctrl/alt if needed
	Shift.l = VK & $100
	Ctrl.l = VK & $200
	Alt.l = VK & $400
	
	If Shift
		keybd_event_(#VK_SHIFT, 0, 0, 0)
	EndIf
	
	If Ctrl
		keybd_event_(#VK_CONTROL, 0, 0, 0)
	EndIf
	
	If Alt
		keybd_event_(#VK_MENU, 0, 0, 0)
	EndIf
	
	; press and release key
	VK & $ff
	keybd_event_(VK, Scan, Extended, 0)
	keybd_event_(VK, Scan, #KEYEVENTF_KEYUP | Extended, 0)
	
	; release shift/ctrl/alt if pressed
	If Shift
		keybd_event_(#VK_SHIFT, 0, #KEYEVENTF_KEYUP, 0)
	EndIf
	
	If Ctrl
		keybd_event_(#VK_CONTROL, 0, #KEYEVENTF_KEYUP, 0)
	EndIf
	
	If Alt
		keybd_event_(#VK_MENU, 0, #KEYEVENTF_KEYUP, 0)
	EndIf
EndProcedure

; send string to foreground application
Procedure SendCommand(String.s)
	For Letter.l = 1 To Len(String)
		SendKey(Mid(String, Letter, 1))
	Next
EndProcedure


Window_0 = OpenWindow(#PB_Any, x, y, 180, 150, "Corsair V1", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)

If Window_0
	String_Ap = StringGadget(#PB_Any, 10, 20, 120, 20, "Appli name")
	
	Button_Li = ButtonGadget(#PB_Any, 130, 20, 40, 20, "A-B")
	Button_Up = ButtonGadget(#PB_Any, 30, 50, 20, 20, "/\")
	Button_Lf = ButtonGadget(#PB_Any, 10, 60, 20, 20, "<")
	Button_Rg = ButtonGadget(#PB_Any, 50, 60, 20, 20, ">")
	Button_Dw = ButtonGadget(#PB_Any, 30, 70, 20, 20, "\/")
	Button_Ta = ButtonGadget(#PB_Any, 10, 100, 40, 30, "Tab")
	Button_En = ButtonGadget(#PB_Any, 70, 100, 40, 30, "Enter")
	Button_F2 = ButtonGadget(#PB_Any, 130, 100, 40, 30, "F2")
	
	String_Cmd = StringGadget(#PB_Any, 80, 60, 50, 20, "Cmd")
  	Button_Se = ButtonGadget(#PB_Any, 130, 60, 40, 20, "Send")
	
  	StickyWindow(Window_0, #True) 
  	
  	DisableGadget(Button_Dw,1)
  	DisableGadget(Button_Up,1)
  	DisableGadget(Button_Lf,1)
  	DisableGadget(Button_Rg,1)
  	DisableGadget(Button_Ta,1)
  	DisableGadget(Button_F2,1)
  	DisableGadget(Button_En,1)
  	DisableGadget(Button_Se,1)
  	DisableGadget(String_Cmd,1)
	
	Repeat
		Event = WaitWindowEvent()
		
		Select Event
				
			Case #PB_Event_CloseWindow
				
				End 
				
			Case #PB_Event_Timer
				
				
			Case #PB_Event_Gadget
				Select EventGadget()
					Case Button_Li
						
						app$ = GetGadgetText(String_Ap)
						hconsole = FindWindow_(0, app$)

						If hconsole
							DisableGadget(Button_Dw,0)
							DisableGadget(Button_Up,0)
							DisableGadget(Button_Lf,0)
							DisableGadget(Button_Rg,0)
							DisableGadget(Button_Ta,0)
							DisableGadget(Button_F2,0)
							DisableGadget(Button_En,0)
							DisableGadget(Button_Se,0)
							DisableGadget(String_Cmd,0)
						EndIf
						
					Case Button_Dw
						
						SendCommand(#VK_DOWN)
						
					Case Button_Up
						
						SendCommand(#VK_UP)
						
					Case Button_Lf
						
						SendCommand(#VK_LEFT)
						
					Case Button_Rg
						
						SendCommand(#VK_RIGHT)
						
					Case Button_F2
						
						SendCommand(#VK_F2)
						
					Case Button_En
						
						SendCommand(#VK_ADD)
						
					Case Button_Ta
						
						SendCommand(#VK_TAB)
						
					Case String_Ap
						
						SetGadgetText(String_Ap,#Empty$)
						
					Case String_Cmd
						
						SetGadgetText(String_Cmd,#Empty$)
						
					Case Button_Se
						
						cmd$ = GetGadgetText(String_Cmd)
						
						SendCommand(cmd$)
						
				EndSelect
				
		EndSelect
	ForEver 
	
EndIf

End
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Rebondissement sur sujet SendMessage_

Message par falsam »

■ A propos de ::
Ekim a écrit :notamment cette inscription "::" m’interpelle

Code : Tout sélectionner

ConsoleLocate(5, 5) :: Print("Produit  : ")
est équivalent à

Code : Tout sélectionner

ConsoleLocate(5, 5)
Print("Produit  : ")
■ Je ne comprends pas ton code. Toutefois tu as des erreurs.

Code : Tout sélectionner

SendCommand(#VK_DOWN)
La procédure SendCommand attend un string et tu envoies une valeur numérique.

Tu cherches a créer un une application dont l'objectif est de contrôler une application console que je ne connais pas. Pas facile de faire des tests :wink:
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ekim
Messages : 215
Inscription : dim. 24/juin/2018 1:20

Re: Rebondissement sur sujet SendMessage_

Message par Ekim »

Salut @falsam, pardonne mon absence car je dois régler de nombreux ennuis en parallèle (c'est le tourbillon de vie :lol: )

pour commencer, merci pour tes explications, comme tu sais, je débute en PB :oops:

concernant mon bout de code (truffé d'erreurs je sais) c'est c'est en réalité une ébauche de projet, ainsi, je voulais te montrer mes limites
et je voulais que tu me donne un coup de main pour la finalisation

pour te répondre, oui, je voulais faire une petite appli consistant à commander l'appli pro de gestion de stock, cette appli est stocké dans un serveur d'une société spécialisé et j'y accède via une connexion Telnet sécurisé donc impossible à avoir chez soit :(

ce projet n'est qu'une 1ere étape, ensuite j'intègrerais le code à mon appli de gestion de donné spécialement formaté pour l'appli pro

Note: à la place de #VK_Down, je voulais mettre une commande équivalente à "flèche bas", mais malheureusement je ne sais pas comment faire :oops:
Répondre