Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SOUSCLASSER LES FENETRES D'1 AUTRE APP


Information sur la source

Catégorie :Exécution Niveau : Débutant Date de création : 14/01/2004 Date de mise à jour : 11/02/2004 15:12:29 Vu / téléchargé: 7 149 / 996

Note :
10 / 10 - par 12 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (40)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
Permet de voir les evennements generer par une fenetre d'une autre application
(mouvement de la sourie, click, deplacement etc...)

C'est un projet en cours de devellopement donc pour le moment vous
pouvez uniquement visualiser les evenements puis agir en consequence

Pour celle et ceux et  qui connaissent l'ENOOOOOOOORME dossier
du sous-classement avec ses avantages et ses difficultés seront
tout de meme apprecier ce bout de code...

voici un petit descriptif de la technique employé (sans rentrer dans les details) :

permierement l'appli verifie que le process proprietaire ne
soit pas le process courant puis il charge la dll de sous-classement
dans le process distant et demarre le moteur de communication
une fois le moteur demarrer l'appli communique avec le serveur
puis lui demande de sous classer la fenetre en question
si cela est possible il le fait et renvoi tout les messages
a notre appli

 

Source

  • 'voir le zip
  • 'Restrictions :
  • ' - un seul hook par app
  • ' - l'image des process doivent etre sur le meme disque
  • ' - disposer d'une platform NT
'voir le zip
'Restrictions :
' - un seul hook par app
' - l'image des process doivent etre sur le meme disque
' - disposer d'une platform NT

Conclusion

bon je sait ya encore bcp de boulot pour que ce soit vraiment exploitable
mais c'est un bon debut et j'espere que d'autre proger vb vont bucher la dessus...

/!\\\\ necessite une platform NT : winNT,win2K ou winXP

@+
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de shadowmoy le 14/01/2004 00:43:17

juste une question : quel interet de subclasser une fenetre d'un autre programme ?

signaler à un administrateur
Commentaire de Renfield le 14/01/2004 01:06:11 administrateur CS

EB, tu as oublié le ZIP...

signaler à un administrateur
Commentaire de Lavieillefolle le 14/01/2004 02:53:22

L'intéret que je peut imaginer serais que si ton programme appel d'autres programmes nem c plus intéressant pour l'utilisateur.

signaler à un administrateur
Commentaire de carlvb le 14/01/2004 08:18:58

Effectivement il semblerait que le zip manque.

signaler à un administrateur
Commentaire de EBArtSoft le 14/01/2004 08:20:22 administrateur CS

Désolé pour le zip je ne sait pas pk il n'est pas passé la premiere
fois pourtant je telecharge tjrs ma source pour tester et ça avais
bien marché... bizzard ?

Quand à l'interet de la source... je cros que c'est tellement
evident que des fois je me demande bien a qui je m'adresse...

bref on a peut etre pas les memes centres d'interet

@+

signaler à un administrateur
Commentaire de Renfield le 14/01/2004 08:39:27 administrateur CS

Vous inquietez par pour l'interêt de la chose, EBArtSoft n'est pas du genre à nous pondre un convertisseur Francs/Euros...

Bien que n'ayant pas eu le loisir de telecharger encore le Zip, je suis sur que l'on se trouve fasse à du travail de qualité.

Cela peut permettre pas mal de choses, mais bon, encore faut-il avoir ne serais-ce qu'une idée de ce qu'est le SubClassing...

Cela peut être notament utile pour tout ce qui est KeyLogger.... (on en vois pas mal par moments sur le site).

signaler à un administrateur
Commentaire de BruNews le 14/01/2004 15:18:11 administrateur CS

Turbo Basic++ a encore frappe.

signaler à un administrateur
Commentaire de Afyn le 14/01/2004 17:37:07

Moi qui vient de l'ATARI et qui a passé 10 ans sans programmer, j'aimerai bien un petit tutorial sur le Sub Classing. Pas que j'aspire à devenir un dieux comme EB, Renfield et autres pointures du site, mais pour ne pas rester trop à la traine. J'imagine assez que l'on capture les évenements destinés aux fenetres des applis (je fait un parallele avec le GEM sur ATARI ?) et qu'il y a des avantages par rapports aux évenements que l'on peut capturer avec VB (en fait on doit pouvoir tous les lires et les traiter de la façon Ki va bien)
Savez tu Mister EB que le petit symbole /|\ que tu utilises parfois est le symbole d'ATARI ?
Noblesse oblige de rendre aux anciens les merveilles dont ils nous ont fait hériter (encore un terme informatique).
(PS tu as reçu mon ZIP?)

A+

Afyn - NAVEDAC

signaler à un administrateur
Commentaire de EBArtSoft le 14/01/2004 17:46:30 administrateur CS

Renfield>Bah quoi ? tu veus un convertisseur EURO/FRANCS ?
j'ai quand meme une grosse chute de tension la ... ouf
je pond que des daubes en ce moment !

BruNews>Aller demain je me met a .NET ! Naaaaan je rigole

Afyn> J'ai debuté avec le GFA Basic sur 1040 ! lol ;-)
(ça fait plein de point commun mine de rien)
J'ai bien reçu ton ZIP et j'en suis encore tout chambouler
je trouve ton interface midi avec la grille et les accord de
gratte terrible !

Mais je me suis pas encore attaqué au code si tu veus
que je regarde un point precis envoi moi un msg

@+

signaler à un administrateur
Commentaire de Kalistor le 15/01/2004 10:22:30

Joli prog ! ya pas, tu maitrises le Win32.

Juste une remarque : je n'ai pas trouvé le code de la DLL injectée (EBSCLS32.DLL) Ou bien je ne l'ai pas vu ?

Et une question : pourquoi livrer cette DLL sous forme de DATA dans un fichier ressource ? c'était pas plus simple de nous livrer directement la dll ?
Sinon, merci pour ce bout de code, il est tres interessant.
PS : si tu pouvais publier le code de EBSCLS32 ce serait bien !

signaler à un administrateur
Commentaire de EBArtSoft le 15/01/2004 11:13:27 administrateur CS

Oui c'est exact j'ai omis cette dll, je l'ai fait avec MASM32
(assembleur x86) elle n'est pas vraiment au point mais
elle est suffisante pour notre exemple voici le code :

;#########################################################################

.386
.model flat, stdcall
option casemap :none

;#########################################################################

include D:\1_MANU\DOC~2.PRO\DOCUME~1\MASM32\include\windows.inc
include D:\1_MANU\DOC~2.PRO\DOCUME~1\MASM32\include\user32.inc
include D:\1_MANU\DOC~2.PRO\DOCUME~1\MASM32\include\kernel32.inc

includelib D:\1_MANU\DOC~2.PRO\DOCUME~1\MASM32\lib\user32.lib
includelib D:\1_MANU\DOC~2.PRO\DOCUME~1\MASM32\lib\kernel32.lib

;#########################################################################

HookProc proto :DWORD,:DWORD,:DWORD,:DWORD
ThreadProc proto :DWORD

;#########################################################################

Version equ 201h
MW_WNDPROC equ 410h
MW_WNDHOOK equ 420h
MW_WNDUNHK equ 430h
MW_PING equ 4FFh

;#########################################################################

MY_STRUCT STRUCT
hWnd DD ?
uMsg DD ?
wParam DD ?
lParam DD ?
MY_STRUCT ENDS

;#########################################################################

.data
Msg1 db "Window Hooked"     ,0
Msg2 db "Window Unhooked"   ,0
Msg3 db "Message"  ,0
Msg4 db "#Library Loaded"   ,0
Msg5 db "#Library Unloaded" ,0

Template db "%d"     ,0

ClassName db "@6912345669@"      ,0
AppName   db "@6912345669@"      ,0

hInstance HINSTANCE ?
CommandLine LPSTR ?
hHook           dd              ?
hwnd HWND ?
handle dd ?
hPID dd ?

lProc dd ?
lhWnd dd ?
lRetn dd ?

;#########################################################################

.code

LibMain proc hInstDLL:DWORD, reason:DWORD, unused:DWORD
.if reason == DLL_PROCESS_ATTACH
;==========================================
;invoke MessageBox,NULL,addr Msg4,NULL,MB_OK
;==========================================

invoke GetCurrentProcessId
mov    hPID,eax

invoke GetModuleHandle,NULL
mov    hInstance,eax

invoke GetCommandLine
mov    CommandLine,eax

invoke CreateThread,NULL,0,ThreadProc,NULL,0,NULL
mov handle,eax

        .elseif reason == DLL_PROCESS_DETACH
;==========================================
;invoke MessageBox,NULL,addr Msg5,NULL,MB_OK
;==========================================

invoke DestroyWindow,hwnd
invoke CloseHandle,handle

.endif

mov eax,1
ret
LibMain Endp

GetVersion proc
mov eax,Version
ret
GetVersion endp

ThreadProc proc lpParameter:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
mov   wc.cbSize,SIZEOF WNDCLASSEX
mov   wc.style, CS_HREDRAW or CS_VREDRAW
mov   wc.lpfnWndProc, OFFSET WndProc
mov   wc.cbClsExtra,NULL
mov   wc.cbWndExtra,NULL
push  hInstance
pop   wc.hInstance
mov   wc.hbrBackground,NULL ;COLOR_WINDOW+1
mov   wc.lpszMenuName,NULL
mov   wc.lpszClassName,OFFSET ClassName
mov   wc.hIcon,NULL   ;eax
mov   wc.hIconSm,NULL ;eax
mov   wc.hCursor,NULL ;eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,0,0,0,0,0,NULL,NULL,hInstance,NULL
mov   hwnd,eax

StartLoop:
       invoke GetMessage,ADDR msg,NULL,0,0         ; get each message
cmp eax, 0                                  ; exit if GetMessage()
je ExitLoop                                 ; returns zero
invoke TranslateMessage, ADDR msg           ; translate it
invoke DispatchMessage,  ADDR msg           ; send it to message proc
jmp StartLoop
ExitLoop:

mov eax,msg.wParam
ret
ThreadProc endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL buffer[128]:byte

.if uMsg == WM_DESTROY
invoke PostQuitMessage,NULL

.elseif uMsg == MW_PING
mov eax,1
ret

.elseif uMsg == MW_WNDPROC
invoke GetWindowLong,wParam,GWL_WNDPROC
mov hHook,eax
ret

.elseif uMsg == MW_WNDHOOK

;.if lProc == 0

;===========================================================
;invoke MessageBox,NULL,addr Msg1,NULL,MB_OK
;===========================================================

mov eax,lParam
mov lRetn,eax

mov eax,wParam
mov lhWnd,eax

;===========================================================
;invoke wsprintf,addr buffer,addr Template,lRetn
;invoke MessageBox,NULL,addr buffer,NULL,MB_OK
;===========================================================

invoke GetWindowLong,wParam,GWL_WNDPROC
mov lProc,eax

invoke SetWindowLong,wParam,GWL_WNDPROC,addr HookProc

;.else
; xor eax,eax
;.endif

ret

.elseif uMsg == MW_WNDUNHK

;.if lProc == 0
; xor eax,eax
;.else

;===========================================================
;invoke MessageBox,NULL,addr Msg2,NULL,MB_OK
;===========================================================
invoke SetWindowLong,lhWnd,GWL_WNDPROC,lProc
mov eax,1

;.endif

ret

.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret

.endif

xor eax,eax
ret
WndProc endp

HookProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
invoke CallWindowProc,lProc,hWnd,uMsg,wParam,lParam
;--------------------------------------------------
ret
HookProc endp

End LibMain

Pour ce qui est de la livrer sous forme de data c'est un choix purement personnel car j'ai horreur de trimballer plein de
dll, ocx etc.. donc la je suis au moin sur de sa presence

@+

signaler à un administrateur
Commentaire de Renfield le 15/01/2004 13:36:01 administrateur CS

Au boulot, j'ai une appli qui a une dizaine d'année, et il y a de serieux manques dans l'interface..... certaines choses sont absentes ou mal placées, les raccourcis claviers sont une horreur sans nom !

Le probleme, c'est que mes collegues et moi, passons 70% de notre temps là dessus...

Ce matin je me suis amusé (oui oui, ca m'amuse) a faire une sort de daemon qui rectifierait un peu la chose....

Et je me suis apercu rapdement que sans hook sur cette application, je ne pourrais pas faire grand chose ;)

J'ai donc telechargé ton source, qui m'epate par la quantité de choses qu'il contient ! Kalistor a raison, tu connais bien Win32 !!

signaler à un administrateur
Commentaire de shadowmoy le 04/02/2004 06:01:48

bon ok j' ai capté le potentiel de cette source mais pourquoi par exemple lorsque j'essaie de recuperer l'evenement click d'un label d'une appli vb qui contient bien un label ca ne fonctionne pas ????
foutus controles windowless ...
une idée de comment vb fait ?

signaler à un administrateur
Commentaire de EBArtSoft le 04/02/2004 07:42:52 administrateur CS

shadomoy>lol tu veus capter les evenements d'un windowless ?
la faudra m'expliquer comment tu fait alors...
sans fenetre pas de WindowProc donc pas de sous classement !

de plus les labels dans les appli VB ce n'est rien d'autre qu'un appel
a DrawText (donc un dessin) donc tu n'es pas pres de le sous
classer a moin de trouver les points d'entré des fonctions ActiveX

@+

signaler à un administrateur
Commentaire de mehdibou le 12/02/2004 21:20:29

Rien à redire, c'est du EBArtSoft ;)

Source excellente qui utilise plein de points avancés de la programmation que j'aime bien :)

10/10 pour remonter la note... certains n'ont pas dû capter l'intérêt de la source...

signaler à un administrateur
Commentaire de CrAzYb le 12/05/2004 09:58:22

Super, trés bon boulot. Depuis longtemps je cherchais un truc du genre, histoire de maitriser une appli externe. Trés bien. 10/10

signaler à un administrateur
Commentaire de daetips le 20/08/2004 18:10:07

Punaise, desfois je me demande si tu dort car tu as posté beaucoup de sources vraiment utiles et qui repoussent les limites du vb (même avec une dll en asm) 10/10.

signaler à un administrateur
Commentaire de MadM@tt le 22/08/2004 16:33:18

Et tu met ça en débutant ?? Je trouve ça génial...

signaler à un administrateur
Commentaire de viran le 21/09/2004 20:58:36

T'est trop un clanpin,ton install il a aps les bosn fichiers d'acces,erreurs par ci et par la,bref grosse deception mais comme tu as pondu des sources superbes et que t'a du te donner du mal je te donne 4/10 meme si y marche aps et evite de nous prendres pour des idiots merci!

signaler à un administrateur
Commentaire de Renfield le 21/09/2004 21:05:18 administrateur CS

je suis désolé de t'apprendre que cela fonctionne très bien....

dis en plus sur ta config...

signaler à un administrateur
Commentaire de EBArtSoft le 21/09/2004 22:47:16 administrateur CS

viran> t'as decider de passer sur toutes mes sources pour dire n'importe quoi ? Tu n'es pas obligé de regarder la source et encore moins de commenter surtout si en plus tu ne comprend rien...

@+

signaler à un administrateur
Commentaire de viran le 25/09/2004 15:43:55

Bon maintenant arrete de gratter ta source elle marche pas alors si tu veux repasser sur tt mes messages pour me repondre je vais faire de meme et normalement j'aurais du noter 2 ou 3 la prochaine je serais moins cool!

signaler à un administrateur
Commentaire de Renfield le 25/09/2004 15:47:43 administrateur CS

Tu ne parviens pas a la faire fonctionner, et tu ne donne aucun indice pour que l'n t'aide a la faire fonctionner....

je m'en sers pour une appli que l'on a au boulot, et ca fonctionne très bien, donc....

signaler à un administrateur
Commentaire de viran le 25/09/2004 15:50:43

p e que tu as un autre systeme d'exploitation que moi en tout cas che zmoi ca marche donc je note comme je peux!

signaler à un administrateur
Commentaire de MadM@tt le 25/09/2004 15:53:20

Je crois que tu es le seul à avoir des problèmes avec les sources d'EBArtSoft, alors montre nous un peu de quoi tu es capable avant de critiquer.

signaler à un administrateur
Commentaire de Renfield le 25/09/2004 16:18:23 administrateur CS

je veux bien le croire.... quel est ton OS ?

quelle manifestation as tu du "ca ne fonctionne pas". Qu'essaies tu de faire exactement.... bref, donne nous quelques indices...

au boulot, j'ai NT4, et chez moi Xp.... (et les deux fonctionnent)

signaler à un administrateur
Commentaire de viran le 25/09/2004 16:23:23

J'ai Windows XP Service pack 2

signaler à un administrateur
Commentaire de Dragonmaster le 16/10/2004 17:50:37

ça fonctionne pour moi avec notepad, la calculatrice mais pas avec MSN !

Serait - il possible d'ajouter un bouton ou tout autre contole dans l'appli ?

signaler à un administrateur
Commentaire de metalcoder le 20/01/2005 07:50:57

J'utilise au travail labview. Labview a la particularité de fonctionner en mode non compilé. j'ai ajouter un utilitaire en VB qui commande Labview (du moins en partie) car je ne peut agir sur les boutons (en mémoire je n'ai que labview.exe, je n'ai pas acces au controle comme une appli standard) J'ai etudier ton programme et il m'as redonner un peu l'espoir de pouvoir controler les controles de labview. Si tu as des conseils pour récuperer le handle d'une appli non compile, n'hesite surtout pas je suis preneur.

A titre d'exemple car je pense que le probleme est le meme que le mien. lancer Vb, faite un bouton sur la fenetre et essayer de trouvé le handle du bouton avec les utilitaires comme spy++...si qqun y arrive ce serait cool

metalcoder

signaler à un administrateur
Commentaire de daetips le 18/04/2005 20:32:11

Tien metalcoder
Private Declare Function WindowFromPoint Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (ByRef David As Point) As Long

Private Type Point
    x As Long
    y As Long
End Type

Private Sub Timer1_Timer()
Dim mypoint As Point
Dim thandle As Long
    GetCursorPos mypoint
    
    thandle = WindowFromPoint(mypoint.x, mypoint.y)
    Me.Caption = thandle

End Sub

Ca te donne le handle du controle même un bouton

signaler à un administrateur
Commentaire de metalcoder le 18/04/2005 21:41:51

Daetips>
J'ai essayer ta solution, elle marche partout et sous Vb non compile mais pas dans labview, dommage. Ton programme reconnait un seul handle sur le programme labview alors qu'il y a 6 boutons, 2 boutons options et des labels...c'est pas grave mais si quelqu'un a une solution.

Metalcoder

signaler à un administrateur
Commentaire de Renfield le 19/04/2005 12:50:44 administrateur CS

Labview doit dessiner les controles lui meme, et gerer les evennements.... pas de fenetre créee par controle.

pour t'en assurer, tu peux utiliser Spy++ et essayer de capturer un de tes boutons...

signaler à un administrateur
Commentaire de loulou06 le 19/08/2006 07:13:59

Moi, j'aurais un petite question.
Au passage total RESPECT a cette DLL, de la grande classe .... :-)
L'equipe qui tue Renfield/Ebart
Dans la WindowProc (DLL), je voudrais detourner et ainsi bloquer certains messages
mais ca ne marcha pas, une idee ? Merci d'avance (reponse en pv please)

Function WindowProc(ByVal hWnd As Long, ByVal umsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim mVar  As HookSubCls
Dim mData As MyStruct
    Select Case umsg
        Case WM_SVRCALL
            ReadStruct wParam, lParam, mData
            For Each mVar In m_Objects
                If mVar.hWnd = hWnd Then
                    mVar.CallBack mData.hWnd, mData.umsg, mData.wParam, mData.lParam
                    Exit For
                End If
            Next
        'Case 123:
        
        Case Else
            If umsg =  m_MsgToSuspend Then
            '' Dans mon cas: m_MsgToSuspend = 123 / WM_CONTEXTMENU
            ''#########################################################
                    WindowProc = 0
            Else
              WindowProc = DefWindowProc(hWnd, umsg, wParam, lParam)
            End If
    End Select

signaler à un administrateur
Commentaire de bouv le 27/12/2006 15:26:51

Salut EB,

J'ai un peu la même question que loulou06.
Comment faire pour bloquer certains messages (ex: WM_DESTROY)

Merci d'avance
++

signaler à un administrateur
Commentaire de BruNews le 27/12/2006 15:34:05 administrateur CS

WM_DESTROY est une notif de post traitement, c'est WM_CLOSE qui est à intercepter pour accepter ou non la fermeture.

signaler à un administrateur
Commentaire de bouv le 27/12/2006 15:53:38

OK merci du conseil.

Cela dit j'ai observé une appli à l'aide de SPY++ et je n'ai pas vu WM_CLOSE mais seulement WM_DESTROY lors de la fermeture de l'appli.
Faut que je revoit ça...

Sinon, saurais-tu comment bloquer ce fameux message une fois qu'il est intercepté ?

Merci d'avance
++

signaler à un administrateur
Commentaire de BruNews le 27/12/2006 16:02:29 administrateur CS

La defWinProc appelle DestroyWindow() par défaut, suffit de ne pas lui repasser le message.

signaler à un administrateur
Commentaire de bouv le 27/12/2006 16:08:46

si je comprend bien il faut remplacer cette ligne

WindowProc = DefWindowProc(hWnd, uMsg, wParam, lParam)

par quelque chose du genre :

If uMsg = WM_CLOSE Then
     WindowProc = DefWindowProc(hWnd, 0, 0, 0)
Else
     WindowProc = DefWindowProc(hWnd, uMsg, wParam, lParam)
End If

signaler à un administrateur
Commentaire de MadM@tt le 15/09/2008 00:38:16

Salut EB, fantastique code.

Par contre quand tu dis : "un seul hook par app", c'est que tu peux faire un seul hook en tout, ou un seul hook par processus externe au tiens.
(ma question c'est est-ce que je peux sous-classer plusieurs fenetres de plusieurs processus avec ce code ?)

et sinon est-ce possible ?

merci
MadMatt

signaler à un administrateur
Commentaire de EBArtSoft le 15/09/2008 09:09:30 administrateur CS

c'est possible (avec la carte kiwi :p )

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,359 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.