Pilotage total appli via API au travers de Windev

Résolu
croquibus Messages postés 6 Date d'inscription vendredi 23 mars 2007 Statut Membre Dernière intervention 18 avril 2007 - 23 mars 2007 à 17:05
cs_patrick2023 Messages postés 3 Date d'inscription dimanche 18 janvier 2004 Statut Membre Dernière intervention 5 janvier 2016 - 28 mars 2008 à 17:59
Hello !!!

Voila, ma mission est d'automatiser entièrement le fonctionnement d'une application.
Je programme sous Windev et j'utilise l'appel d'API windows pour gérer un certain nombres d'actions.
Sur une fenêtre fille, je parviens bien à ouvrir une combo, à sélectionner une ligne précise parmi les différents éléments et la combo se referme bien sur mon élément sélectionné.
Maintenant, l'élément que j'ai sélectionné dans cette combo reste sur fond bleu comme si il avait le focus et donc ensuite je ne peu plus cliquer sur le bouton de validation de cette même fenêtre comme si je n'avais plus la main.
Si dans mon programme j'ignore le passage sur cette combo, le clic sur mon bouton de validation fonctionne.
Qu'elle est l'api qui me libèreait de cette impasse ?

Merci
 
A voir également:

17 réponses

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
23 mars 2007 à 17:46
As tu essayé de redonner le focus au boutton de validation ?

API("USER32", "SendMessageA", hWndBtnOK, WM_SETFOCUS,  
hWndCombo, 0)
3
cs_patrick2023 Messages postés 3 Date d'inscription dimanche 18 janvier 2004 Statut Membre Dernière intervention 5 janvier 2016
26 mars 2007 à 19:53
Bonjour croquibus,
bonjour les autres,

J'ai également l'intention de piloter une apllication en Windev. J'en suis au début. Je viens de récupérer les handle de la fenetre. Je ne sais pas encore comment distinguer les objets combos. Et encore moins de trouver leur contenu.
Une aide de ta part me serait précieuse.
 Peux tu m'envoyer un exemple.
Merci.
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 avril 2007 à 17:23
EnableWindow

si "griser" est mettre ou non en readonly, faut modifier les styles.

ciao...
BruNews, MVP VC++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
24 mars 2007 à 00:35
Autre méthode pour focus sur un controle:
SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM) hctrl, 1);
SendMessage(hdlg, WM_NEXTDLGCTL, 0, 0); // next ctrl
SendMessage(hdlg, WM_NEXTDLGCTL, 1, 0); // prev ctrl

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
croquibus Messages postés 6 Date d'inscription vendredi 23 mars 2007 Statut Membre Dernière intervention 18 avril 2007
26 mars 2007 à 09:51
Ok, merci pour cette réponse qui me va apparement.
Mais en tant que débutant comment faut-il que je renseigne les variables HwndBtnOk, WM_SetFocus et HwndCombo ???
Sous windev, ces valeurs sont de type entière.
Faut-il que j'indique le Handle de chacun des objets concernés de ma fenêtre dans ces variables ??
Si oui, comment récupérer les Handle d'un objet précis sur une fenêtre afin de pouvoir intervenir dessus ?

Merci encore et désolé pour ce départ un peu cahotique.

Fred. 
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
26 mars 2007 à 18:20
hcontrol = GetDlgItem(hparent, controlID);

ciao...
BruNews, MVP VC++
0
croquibus Messages postés 6 Date d'inscription vendredi 23 mars 2007 Statut Membre Dernière intervention 18 avril 2007
27 mars 2007 à 09:21
Salut Patrick,
Ok pour te retransmettre mon savoir mais comme dirait Ségolène (donnant donnant)
C'est à dire que si tu as des infos, merci de me les retransmettre à ton tour.

Bon, je ne sais pas si il y a d'autre méthode mais pour l'instant cela fonctionne.
Moi je lance une appli non Windev avec DDELANCE et ensuite :

//----------------------------------------------------------------------------------------------------------
// Comment tu dois déclarer les variables pour piloter la souris
//----------------------------------------------------------------------------------------------------------

sz

LEFTDOWN est une chaîne ASCIIZ sur
50
sz

LEFTUP est une chaîne ASCIIZ sur
50sz

ABSOLUTE est une chaîne ASCIIZ sur
50n

LDOWN est un entier système
n

LUP est un entier système
n

ABSO est un entier système
//---------------------------------------------------------------------------------------------------------------
// Comment tu dois renseigner les variables pour clic enfoncé ou pas
//---------------------------------------------------------------------------------------------------------------

sz

LEFTDOWN =
"H2"n

LDOWN = &
szLEFTDOWN sz

LEFTUP =
"H4"n

LUP = &
szLEFTUP sz

ABSOLUTE =
"H8000"
n

ABSO = &
szABSOLUTE//------------------------------------------------------------------------------------------------------
// Et là, tu balades ta souris où tu veux
//------------------------------------------------------------------------------------------------------

X

=
20
// Vers la droiteY

=
35
// Vers le basb

RetourneFonction =
API(
"USER32",
"SetCursorPos",
X,
Y)
b

RetourneFonction =
API(
"USER32",
"mouse_event",
nLDOWN +
nABSO,
X,
Y,
0,
0)
b

RetourneFonction =
API(
"USER32",
"mouse_event",
nLUP +
nABSO,
X,
Y,
0,
0)

Maintenant, je recherche comment avoir la main sur chaque controle de la fenêtre active, je ne suis toujours pas parvenu à le faire.

Chao Patrick.
0
croquibus Messages postés 6 Date d'inscription vendredi 23 mars 2007 Statut Membre Dernière intervention 18 avril 2007
27 mars 2007 à 15:35
Bon, j'avance à pas de souris.
Ok pour la reprise de focus sur mon bonton de validation en sortant de ma combo.

Merci encore

Mais n'y a t'il pas de différence entre une fenêtre appartenant au monde de Windows comme c'était le cas pour cet première fenêtre et une fenêtre appartenant à un programme étranger à windows.

Car voila, mon premier travail était d'ouvrir et de sélectionner automatiquement une imprimante par défaut dans le monde windows. Ca c'est OK

Mais je suis maintenant dans une fenêtre fille appartenant à un programme non windows, sur laquelle je dois également sélectionner un élément dans une combo et là ????
Il ne se passe rien alors que je viens de le faire juste avant ????????

Je parviens bien à récupérer le handle et le nom de la fenêtre mère de l'application mais je ne parviens pas à connaitre le handle de cet petite fenêtre qui se trouve au centre de mon écran et de ce fait, je ne parviens pas à avoir la main dessus.
Une fois cette petite fenêtre affiché, j'ai beau envoyer des GetForegroundWindow, GetActiveWindows, C'est toujours le handle de la fenêtre mère qui apparait.

La question c'est, comment faire pour récuperer le handle de ce fichu petit bout de fenêtre ??
Car j'imagine que lorsque j'aurai son handle, que tout sera beaucoup plus facile pour moi.

Merci.  
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
27 mars 2007 à 18:08
Que dois tu imprimer ?
Il vaut mieux utiliser les fonctions d'impression interne à windev.
Sinon je ne vois pas ce que tu veux faire exactement...
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
27 mars 2007 à 18:28
Des apis utiles dans le cas ou tu persisterais dans ce sens :

Il y a GetWindow avec param fenètre mère et param GW_CHILD.

Sinon tu peux essayer FindWindowExavec NULL pour le param firstChildWindow, elle te donnera la premiere fille de la topWindow passée.

Sinon, y'a EnumChildWindows, mais il faut fournir une fonction callback en plus.

Tu as aussi ChildWindowFromPoint qui te donne le handle grace aux coordonnées d'un point sur l'écran et une fenetre mère spécifiée.
0
croquibus Messages postés 6 Date d'inscription vendredi 23 mars 2007 Statut Membre Dernière intervention 18 avril 2007
28 mars 2007 à 16:13
Bon, j'ai finalement trouvé une patie des mes problèmes.
En fait mon programme de pilotage d'une autre appli était bon mais apparement il fonctionnait trop vite.

He voui, depuis que je lui est mis quelques temporisation dans le ventre, tout se déroule correctement pour l'instant.

Mais il me reste encore quelques obstacles à franchir.
Je n'arrive toujours pas à obtenir l'id d'un contrôle sur une de ces fenêtres.

Par exemple, à l'issue de mon choix d'imprimante (PdfCréator) entre autre j'aimerai personnaliser le nom du fichier que va me cracher PdfCréator dans le champ prévu à cet effet.

Mais pour cela, il me faut l'id de ce champ et je ne parviens toujours pas à le récupérer afin d'utiliser ensuite la fonction SendMessage(SetDlgItem ...) et le nom de mon fichier finale.

En deux mots, je souhaite modifier le contenu d'une zone de saisie.

Merci pour vos infos.
 
0
ben_vip Messages postés 2 Date d'inscription mardi 3 avril 2007 Statut Membre Dernière intervention 3 avril 2007
3 avril 2007 à 16:07
Bonjour a tous

Je me permet de poster a cet endroit car j'ai un souci (visiblement dans l'utilisation des API Windows sous Windev)

Je suis actuellement sous Windev 9.0, et je souhaite récupérer le Login Windows, dans le but de le concaténer à un nom de répertoire pour nettoyer les fichier temporary internet files.

J'ai essayé de chercher dans l'aide de Windev, sans résultat.

Quelqu'un aurait-il une idée ?

Ben
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 avril 2007 à 16:56
Le chemin du cache se retrouve avec les APIs, jamais par concaténation car user peut très bien l'avoir modifié.

http://www.cppfrance.com/code.aspx?ID=33333
prends donc un prog tout fait que tu lanceras depuis ton interprété, sera bien plus sur et moins galère.

ciao...
BruNews, MVP VC++
0
ben_vip Messages postés 2 Date d'inscription mardi 3 avril 2007 Statut Membre Dernière intervention 3 avril 2007
Modifié par Jeff le 29/07/2013 à 10:58
Merci pour ta réponse, mais ce n'est pas exactement celle que j'attendais.


En fait je bosse sur ca car j'ai pour projet de réaliser en Windev un genre de CCleaner, je fait dans le cadre de mes actions en BTS IG.

En fait je pense pouvoir me débrouiller, sauf pour récup le nom du l'user loggé !

Ben
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 avril 2007 à 01:33
GetUserName()

ciao...
BruNews, MVP VC++
0
croquibus Messages postés 6 Date d'inscription vendredi 23 mars 2007 Statut Membre Dernière intervention 18 avril 2007
18 avril 2007 à 15:02
Hello !!!

me revoilou avec une petite question.
quelle instruction api permet de griser et de dégriser une zone EDIT.
Je vous rappel que j'utilise l'api au travers de Windev.

Mais donnez moi toujours les grandes lignes, je me débrouillerai avec les points de détail.

Fred.
0
cs_patrick2023 Messages postés 3 Date d'inscription dimanche 18 janvier 2004 Statut Membre Dernière intervention 5 janvier 2016
28 mars 2008 à 17:59
Bonjour croquibus,
Excuses moi, je n'ai pas eu le temps de participer.
Cela m'intéresse toujours.
J'ai trouvé ce bout de code qui pourrait peut etre t'aider :
PROCEDURE

Griser_boutonFermer(
Handel est une entier système,
Griser est un booléen =
Vrai )
RetourFonction

est un booléen
countMenu

est un entier
SI

Handel =
0 ALORS RENVOYER
FauxSI

Griser ALORS

// Grisage de l'incone de fermeture du menu systéme de la fenêtre

countMenu=
API(
"USER32",
"GetSystemMenu",
Handel,
Faux )SI

countMenu <
1 ALORS RENVOYER
Faux

RetourFonction =
API(
"USER32",
"RemoveMenu",
countMenu,
61536,
0)SI

RetourFonction =
Faux ALORS RENVOYER
FauxSINON

// Dégrisage de l'incone de fermeture du menu systéme de la fenêtre

API(
"USER32",
"GetSystemMenu",
Handel,
Vrai)FIN

// On redessine la fenêtre

RetourFonction

=
API(
"USER32",
"DrawMenuBar",
Handel)
RENVOYER

Vrai
0
Rejoignez-nous