PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Hook souris
Débuté par nac, 25 jan. 2023 14:28 - 3 réponses
Membre enregistré
29 messages
Posté le 25 janvier 2023 - 14:28
Bonjour a tous,

J'ai une application windev 27 qui doit intercepter le clic sur un bouton (A) d'un autre logiciel (non windev) qui lance une impression .

Je voudrais entre le clic sur le bouton A et son impression executer le code du bouton (BT_ENTER ) qui se trouve dans mon application windev qui valide une info et si c'est correct laisser l'impression se faire sinon ne rien faire.

J'intercepte bien le clic et il execute bien le code de mon bouton BT_ENTER mais il lance l'impression du bouton A avant d'aller dans mon code BT_ENTER.


j'ai utilisé le hook.

Quelqu'un a-t-il une idée ?

MErci d'avance
Nac


Dans l'initialisation de ma fenetre :
//////////////////////////////////
CONSTANTE
WH_MOUSE_LL = 14

WM_LBUTTONDOWN = 513
WM_LBUTTONUP = 514
WM_LBUTTONDBLCLK = 515

WM_RBUTTONDOWN = 516
WM_RBUTTONUP = 517
WM_RBUTTONDBLCLK = 518

WM_MBUTTONDOWN = 519
WM_MBUTTONUP = 520
WM_MBUTTONDBLCLK = 521

WM_MOUSEMOVE = 512
WM_MOUSEWHEEL = 522

MK_LBUTTON = 1

MOUSEEVENTF_ABSOLUTE = 32768//0x8000

MOUSEEVENTF_LEFTDOWN = 2//0x0002
MOUSEEVENTF_LEFTUP = 4//0x0004

MOUSEEVENTF_RIGHTDOWN = 8//0x0008
MOUSEEVENTF_RIGHTUP = 16//0x0010

MOUSEEVENTF_MIDDLEDOWN = 32//0x0020
MOUSEEVENTF_MIDDLEUP = 64//0x0040

MOUSEEVENTF_MOVE = 1//0x0001

MOUSEEVENTF_WHEEL = 2048//0x0800
MOUSEEVENTF_HWHEEL = 4096//0x1000

MOUSETRAILS = 39//39
MOUSE_EVENT = 2//0x0002
MOUSE_MOVED = 1//0x0001

XBUTTON1 = 1
XBUTTON2 = 2
FIN

iHook est un entier système = 0
iHook = API("user32","SetWindowsHookExA",WH_MOUSE_LL,&MouseEvent,Instance(),0)

////////////////////////////
Dans la procedure local MouseEvent :
PROCEDURE MouseEvent(iIdHook est un entier,wParam est un entier,LParam est un entier)
amount_tmp est un réel
mok est un entier
mok=0
SELON wParam

//Bouton gauche enfoncé
CAS WM_LBUTTONDOWN //513

// Trace("Bouton gauche enfoncé")

//Récupérer le handle de la fenêtre Windows cliquée
strPOINT est une Structure
x est un entier
y est un entier
FIN

stPoint est une strPOINT
stPoint.x = PoidsFaible(CurseurPos(cpEcran))
stPoint.y = PoidsFort(CurseurPos(cpEcran))

iHandle est un entier système
iHandle = API("USER32","WindowFromPoint",stPoint)

IF stPoint.x >=415 AND stPoint.x <=616 AND stPoint.y >=39 AND stPoint.y <=81 THEN
iX = stPoint.x
iY = stPoint.y

ExécuteTraitement(BTM_ENTER1,trtClick)
END

//Bouton gauche relaché
CAS WM_LBUTTONUP //514
// Trace("Bouton gauche relaché")

//Bouton droit enfoncé
CAS WM_RBUTTONDOWN //516
// Trace("Bouton droit enfoncé")

//Bouton droit relaché
CAS WM_RBUTTONUP//517
// Trace("Bouton droit relaché")

//Déplacement souris
CAS WM_MOUSEMOVE //512
// Trace("Déplacement souris")

//Roulette souris
CAS WM_MOUSEWHEEL //522
// Trace("Roulette souris")
FIN

RENVOYER API("User32","CallNextHookEx",iHook,iIdHook,wParam,LParam)
Membre enregistré
111 messages
Popularité : +1 (1 vote)
Posté le 25 janvier 2023 - 18:13
Bonjour,

Curieux de savoir si il y a une astuce possible à ce que vous cherchez à faire ...
Dans le principe, qu'est ce qui pourrait empêcher l'appli non windev de poursuivre son cours même si vous avez intercepté un clic de souris sur le bouton qui lance l'impression. Le dit bouton ayant reçu son clic, il exécute son code et vous ne pouvez intervenir dans le code que vous n'avez pas écrit.
Peut être voir du côté de l'impression ? Bloqué, supprimé l'impression et ensuite piloter ou pas un 2e clic sur le bouton de l'appli tierce. Dans tous les cas, ça resterait bancal comme solution.
Membre enregistré
29 messages
Posté le 26 janvier 2023 - 11:21
Bonjour

Lorsque je le prends en debug il recupere bien le clic avant d'executer l'impression de l'autre application mais sans debug ca ne marche pas.
Si je ne me trompe pas c'est pas le clicdown qui execute le code d'un bouton mais le clicup, c'est pour cette raison qu'on peut intercepter.

mais pq ca ne marche pas en execution !?!?

je cherche tjrs
Membre enregistré
58 messages
Popularité : +6 (6 votes)
Posté le 27 janvier 2023 - 08:50
Bonjour,

Je pense, comme NadSoftware, qu'il n'est pas possible (et cela devrait rester ainsi), de "bloquer" le traitement d'un autre logiciel.
La solution ici, serait de mettre sur pause l'impression, le temps de valider l'info.
Puis de relancer le spooler d'impression ou de supprimer le document dans le spooler puis de relancer le spooler.

--
Qui ne sait rien, de rien ne doute...