Programme bloqué

Résolu
goutbouyo
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008
- 30 oct. 2004 à 18:01
goutbouyo
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008
- 31 oct. 2004 à 11:44
Salut,

J'ai l'impression que mon programme se bloque au niveau d'un case WM_USER+1:

J'ai ma dll :
LRESULT CALLBACK kbdWinAmp(int nCode, WPARAM wParam, LPARAM lParam) 
{
if(nCode >= 0) 
  {
   //quand une fenetre est activé
  if(nCode == HCBT_ACTIVATE)  //ACTIVATE
  {
if (hDlg = FindWindow(g_val,NULL))
  
  {
  if (Dlg=FindWindow(NULL,"Protection activée"))
  {									  
PostMessage(Dlg, WM_USER+1, 0, 0);
  }

  }
  }
  
  }
return CallNextHookEx(hhk, nCode, wParam, lParam);
}

extern "C" __declspec(dllexport) int __stdcall Intercepte(char val[256])
{
  if(!hhk)
  {
  sprintf(g_val,"%s",val);	  
  hhk  = SetWindowsHookEx(WH_CBT, kbdWinAmp, thismod, 0); 
 
  	  
  }

    
  return (int) hhk;
}

extern "C" __declspec(dllexport) void __stdcall FinIntercepte()
{
  if(hhk) 
  {
  UnhookWindowsHookEx(hhk); 
  hhk = 0;
  }
}


Dans mon programme, je demande d'intercepter:
//Bouton activer
case IDC_ACTIVER:

GetDlgItemText(hwnd,IDC_EDIT2,ligne2,sizeof ligne2);	//récupère mot passe saisi

//si mot de passe bon
if (strcmp(ligne2,pass)==0)
{
MessageBox(NULL, "Mot de passe accepté\nProtection activée ", "Succés",MB_OK| MB_ICONINFORMATION);

if(!actif)
actif = TRUE;
Intercepte("Outlook Express Browser Class");		SetWindowText(hwnd,"Protection activée");
}
else	MessageBox(NULL, "Mot de passe erroné\nDésolé ...", "Erreur",MB_OK| MB_ICONWARNING);
return TRUE;


Je traite le WM_USER+1
case WM_USER+1:
FinIntercepte();	//arrête la recherche de la fenêtre
MessageBox(NULL, "Mot de passe accepté\nProtection activée ", "Succés",MB_OK| MB_ICONINFORMATION);
return TRUE;


Le problème c'est que la messagebox dans WM_USER+1 n'apparait que si outlook est là(normal) et squand je clique sur mon programme(pas normal...).

Pouvez vous m'aider SVP ???

9 réponses

cs_aardman
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
31 oct. 2004 à 02:36
Salut,
Il me semble que c'est un truc de ce genre, j'en ai jamais utilisé en fait donc faudra peut etre que tu cherches un peu:

#pragma data_seg("Shared")
char g_val[256];
#pragma data_seg()
#pragma comment(linker, "/section:Shared,rws")

il faut bien comprendre que la fonction Intercepte() qui initialise la valeur de g_val est appelée 1 fois pour la dll qui est dans ton processus... mais pour les autres dll mappées dans les autres processus elle n'est pas appelée, et donc g_val n'est pas initialisée.
3
cs_AlexMAN
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
30 oct. 2004 à 18:42
tu n'aurais pas oublié un break ou un return au dessus du case WM_USER + 1 ?

Au fait, fais un #define WM_MYMSG (WM_USER + 1)
Ce sera plus clair ;)
0
goutbouyo
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008

30 oct. 2004 à 19:22
Non j'ai pas oublié de return TRUE;

Ce qui est bizarre, c'est que si je met dans ma dll:
if (hDlg = FindWindow("Outlook Express Browser Class",NULL))
Ca met direct le message.
Alors que si je met:
if (hDlg = FindWindow(g_val,NULL))
Ca met le message seulement si je clique sur mon programme.

On dirait que mon programme attend de recevoir le focus avant de traiter le message.
0
goutbouyo
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008

30 oct. 2004 à 19:37
En fait ça vient encore de ma dll.

Comme ça ça marche pas :
#include <windows.h>
#include <stdio.h>

#define WM_ALERTE (WM_USER+3)
HINSTANCE thismod;
HINSTANCE hInstance;
HHOOK hhk;
HWND hDlg;
HWND Dlg;
char g_val[256];
char val[256];
int debut;

BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID Reserved)
{
  if(dwReason = = DLL_PROCESS_ATTACH) 
  thismod = hDll;

  return 1;
}

LRESULT CALLBACK kbdWinAmp(int nCode, WPARAM wParam, LPARAM lParam) 
{
if(nCode >= 0) 
  {
   //quand une fenetre est activé
  if(nCode == HCBT_ACTIVATE)  //ACTIVATE
  {
 if (hDlg = FindWindow(g_val,NULL)) 
  
  {
  if (Dlg  = FindWindow(NULL,"Protection activée"))
  {									  
PostMessage(Dlg, WM_ALERTE, 0, 0);
  }

  }

  }
  
  }
return CallNextHookEx(hhk, nCode, wParam, lParam);
}

extern "C" __declspec(dllexport) int __stdcall Intercepte(char val[256])
{
  if(!hhk)
  {
  sprintf(g_val,"%s",val);	  
  hhk  = SetWindowsHookEx(WH_CBT, kbdWinAmp, thismod, 0); 	 
  	  
  }    
  return (int) hhk;
}

extern "C" __declspec(dllexport) void __stdcall FinIntercepte()
{
  if(hhk) 
  {
  UnhookWindowsHookEx(hhk); 
  hhk = 0;
  }
}
Par contre là ça marche :
<table border=0 cellspacing=0 cellpadding=4 bgcolor=#E0E0E0><tr><td class=code>
strcpy(g_val,"Outlook Express Browser Class");
if (hDlg = FindWindow(g_val,NULL));
0

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

Posez votre question
cs_aardman
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
30 oct. 2004 à 23:20
Salut,
g_val, comme son nom semble l'indiquer, ne devrait pas etre dans une section shared plutot ?
Car la, lorsque la dll est mappée dans un autre processus, g_val n'a toujours pas été initialisé au moment ou tu appeles FindWindow(...).
0
goutbouyo
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008

31 oct. 2004 à 02:07
Tu as sans doute raison.

Je le met où alors le g_val ???
Dans un header ?
0
cs_aardman
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
31 oct. 2004 à 02:40
Salut,
Le bout de code que j'ai donné plus haut est valable pour VC++/VS. Pour les autres je sais pas..
0
goutbouyo
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008

31 oct. 2004 à 10:31
VC++ 6 me met pour ton code :

LINK : warning LNK4039: section "Shared" specified with /SECTION option does not exist

Pourtant ton code doit être bon, je l'ai vu dans une source.
0
goutbouyo
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008

31 oct. 2004 à 11:44
Faut mettre quoi dans LINK.
J'ai vus sur MSDN qu'il fallait rajouter l'option /section mais j'y arrive pas ...
0