Pilotage total appli via API au travers de Windev [Résolu]

Messages postés
6
Date d'inscription
vendredi 23 mars 2007
Dernière intervention
18 avril 2007
- - Dernière réponse : cs_patrick2023
Messages postés
3
Date d'inscription
dimanche 18 janvier 2004
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
 
Afficher la suite 

Votre réponse

17 réponses

Meilleure réponse
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Dernière intervention
23 janvier 2016
3
Merci
As tu essayé de redonner le focus au boutton de validation ?

API("USER32", "SendMessageA", hWndBtnOK, WM_SETFOCUS,  
hWndCombo, 0)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de yann_lo_san
Messages postés
3
Date d'inscription
dimanche 18 janvier 2004
Dernière intervention
5 janvier 2016
3
Merci
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de cs_patrick2023
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
3
Merci
EnableWindow

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

ciao...
BruNews, MVP VC++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
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++
Commenter la réponse de BruNews
Messages postés
6
Date d'inscription
vendredi 23 mars 2007
Dernière intervention
18 avril 2007
0
Merci
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. 
Commenter la réponse de croquibus
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
hcontrol = GetDlgItem(hparent, controlID);

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
6
Date d'inscription
vendredi 23 mars 2007
Dernière intervention
18 avril 2007
0
Merci
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.
Commenter la réponse de croquibus
Messages postés
6
Date d'inscription
vendredi 23 mars 2007
Dernière intervention
18 avril 2007
0
Merci
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.  
Commenter la réponse de croquibus
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Dernière intervention
23 janvier 2016
0
Merci
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...
Commenter la réponse de yann_lo_san
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Dernière intervention
23 janvier 2016
0
Merci
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.
Commenter la réponse de yann_lo_san
Messages postés
6
Date d'inscription
vendredi 23 mars 2007
Dernière intervention
18 avril 2007
0
Merci
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.
 
Commenter la réponse de croquibus
Messages postés
2
Date d'inscription
mardi 3 avril 2007
Dernière intervention
3 avril 2007
0
Merci
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
Commenter la réponse de ben_vip
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
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++
Commenter la réponse de BruNews
Messages postés
2
Date d'inscription
mardi 3 avril 2007
Dernière intervention
3 avril 2007
0
Merci
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
Commenter la réponse de ben_vip
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
GetUserName()

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
6
Date d'inscription
vendredi 23 mars 2007
Dernière intervention
18 avril 2007
0
Merci
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.
Commenter la réponse de croquibus
Messages postés
3
Date d'inscription
dimanche 18 janvier 2004
Dernière intervention
5 janvier 2016
0
Merci
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
Commenter la réponse de cs_patrick2023

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.