IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Win32 - Windows Messages problems


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 19
    Points : 4
    Points
    4
    Par défaut Win32 - Windows Messages problems
    Bonjour a tous !

    J'ai commencé un projet ou je souhaiterai pouvoir faire poper le clavier virtuel ( sa cest la partie facile ) au moment ou l'utilisateur clique sur un controleur ou il est possible d'ecrire ( textbox dans une page web, notepad, words, cellule excel, .... )( sa cest la partie ou j'ai des soucis ).

    Apres enquete j'ai decouvert les "Windows Messages", j'arrive à recuperer le processus sur lequel le focus est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    HWND GetGlobalFocus()
    {
    	// remember focus window for the current thread
    	HWND hWndLocalFocus = GetFocus();
     
    	// find foreground window
    	HWND hWndFore = GetForegroundWindow();
    	if (hWndFore == NULL)
    		return NULL;
     
    	// get IDs of the current thread and the thread that
    	// owns foreground window
    	DWORD dwCurrID = GetCurrentThreadId();
    	DWORD dwForeID = GetWindowThreadProcessId(hWndFore, NULL);
     
    	// if the current thread owns foreground window then just
    	// return hWndLocalFocus
    	if (dwForeID == dwCurrID)
    		return hWndLocalFocus;
     
    	// attach input states of the current thread and the foreground
    	// thread
    	if (!AttachThreadInput(dwCurrID, dwForeID, TRUE))
    		return NULL;
     
    	// now the current thread and the foreground thread have common
    	// input state and we can query for a focus window
    	HWND hWndGlobalFocus = GetFocus();
     
    	// detach threads
    	AttachThreadInput(dwCurrID, dwForeID, FALSE);
     
    	// restore local focus
    	SetFocus(hWndLocalFocus);
     
    	return hWndGlobalFocus;
    }
     
    unsigned long GetTargetThreadIdFromWindow()
    {
    	HWND targetWnd;
    	HANDLE hProcess;
    	unsigned long processID = 0;
     
    	targetWnd = GetGlobalFocus();
    	return GetWindowThreadProcessId(targetWnd, &processID);
    }
    et donc j'injecte ma petite DLL dedans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    HINSTANCE hinst = LoadLibrary(L"WindowsHookDLL.dll");
    	MSG  uMsg;
    	cout << "load DLL: " << hinst << endl;
    	system("PAUSE");
     
    	if(!hinst){
    		cout << "ERROR DLL" << endl;
    		system("PAUSE");
    		return 0;
    	}
    	typedef void (*Install)(unsigned long);
    	typedef void (*Uninstall)();
     
    	Install install = (Install) GetProcAddress(hinst, "install");
    	Uninstall uninstall = (Uninstall) GetProcAddress(hinst, "uninstall");
     
    	while(true){
    		system("CLS");
     
    		PrintActualWindow();
     
    		unsigned long threadID = GetTargetThreadIdFromWindow();
    		cout << "ThreadID: "<< threadID<<endl;
     
    		install(threadID);
     
    		//Sleep(2000);
    	}
    	uninstall();
     
    	system("PAUSE");
    	return 0;
    petite DLL qui ecoute les windows messages :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include <iostream>
    //#include <string>
    #include <windows.h>
    #include <fstream>
    #include "WindowsMessages.h";
     
    using namespace std;
     
    HINSTANCE hinst;
     
    #pragma data_seg(".shared")
    HHOOK hhk = NULL;
    #pragma data_seg()
    #pragma comment(linker, "/SECTION:.shared,RWS")
     
    LRESULT CALLBACK MessageHookProcedure(int code, WPARAM wParam, LPARAM lParam){
     
    	WindowsMessages WM = WindowsMessages(((CWPSTRUCT*)lParam)->message);
    	boolean jump = WM.getMessageJump();
     
    	if(!jump){
    		ofstream myfile;
    		myfile.open ("D:/test.txt", ios::out | ios::app );
    		myfile << "get: " << WM.getMessageCode() << " " << WM.getMessageName() << "\n";
    		myfile.close();
    	}
    	return CallNextHookEx(hhk,code,wParam,lParam);
    }
     
    extern "C" __declspec(dllexport) void install() { 
    	hhk = SetWindowsHookEx(WH_CALLWNDPROC, MessageHookProcedure, hinst, NULL);
    }
    extern "C" __declspec(dllexport) void uninstall() {
    	UnhookWindowsHookEx(hhk); 
    }
     
    BOOL WINAPI DllMain(  __in  HINSTANCE hinstDLL,	__in  DWORD fdwReason,	__in  LPVOID lpvReserved){
    	hinst = hinstDLL;
    	return TRUE;
    }
    ma class WindowsMessages cest juste histoire d'avoir tous les windows messages ID ( le numero hexa ) et le nom en chaine de caractere, histoire de pouvoir lire le log.

    Le truc cest que je recoie des milliards de messages different , je sais pas lequel je dois attraper ou meme si ce message existe.
    Des idées ?

    Merci !

    J'ai posté la aussi parce que je sais pas trop ou est le meilleur endroit :
    http://www.developpez.net/forums/d12...s/#post6764361

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Je dirais que tu peux intercepter WM_SETFOCUS, mais je ne suis pas sûr que ce soit l'idéal.

    Il existe un outil génial (Spy++) qui permet d'intercepter les messages reçus par les fenetres. ça devrait te donner qq indices de ce qu'il convient d'intercepter.

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 19
    Points : 4
    Points
    4
    Par défaut
    oui je connai spy++ mais pas reussi a trouvé. Je suis sur ce projet depuis des semaines maintenant.
    WM_SETFOCUS je le lis dans mon log mais comment je dois l'exploiter? un exemple de code ?

    merci pour ta reponse !

  4. #4
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Non je n'ai pas d'exemple de code. Je n'ai jamais personnellement utilisé les hooks. Mais par définition, si ton Hook reçoit le message WM_SETFOCUS, ça veut dire que la fenêtre a laquelle il est attaché vient de recevoir le focus clavier. A toi à ce moment-là de décider ce qu'il faut faire.
    Es-tu familier avec les WindowProcs et toute l'infrastructure de messagerie sous Windows ?

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 19
    Points : 4
    Points
    4
    Par défaut
    non aucune idée de ces choses la.

    J'ai appris le C++ pour ce projet et mener l'enquete pour savoir comment resoudre ma problematique. Les windows messages semblent pour moi etre prometeur mais le message WM_SETFOCUS n'est appelé que quand on change le focus d'une fenetre à une autre.

    Comment puis je avoir le meme genre de messages mais pour un control, à l'interieur d'une fenetre. Comme ça je pourrai ensuite savoir si ce control est à meme d'accepter du texte.......

    merci pour tes reponses

  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Sous Windows, tous les controles (editbox, menu etc) sont AUSSI des fenetres.
    Du coup, ton message WM_SETFOCUS va probablement être reçu par le controle editable.
    Tu n'as pas essayé, avec Spy++, d'intercepter les messages vers un EditBox ?

  7. #7
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 19
    Points : 4
    Points
    4
    Par défaut
    nan je comprends pas trop comment fonctionne spy++

    j'ai lu sur un autre forum que WM_COMMAND est interressant aussi mais jvois pas comment lexploiter ( http://www.powerbasic.com/support/pb...ad.php?t=37297 )

    help !!! lol

Discussions similaires

  1. window.open : probleme avec IE
    Par WeDgEMasTeR dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/05/2006, 22h47
  2. [Windows][Fichier] problème de "/"
    Par gronono dans le forum Entrée/Sortie
    Réponses: 22
    Dernier message: 22/02/2006, 19h50
  3. Réponses: 9
    Dernier message: 22/02/2006, 15h53
  4. [udf] [windows 95] probleme d'UDF
    Par iguanevif dans le forum Débuter
    Réponses: 19
    Dernier message: 27/05/2004, 19h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo