begin process at 2008 08 20 17:25:58
1 228 990 membres
350 nouveaux aujourd'hui
14 259 membres club

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 !

Sujet : Programme bloqué [ Archives / Au secours ] (goutbouyo)

Programme bloqué le 30/10/2004 18:01:34

goutbouyo
Membre Club
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 ???

Re : Programme bloqué le 30/10/2004 18:42:25

AlexMAN
Membre Club
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 ;)

Re : Programme bloqué le 30/10/2004 19:22:09

goutbouyo
Membre Club
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.

Re : Programme bloqué le 30/10/2004 19:37:32

goutbouyo
Membre Club
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 :

strcpy(g_val,"Outlook Express Browser Class");
if (hDlg = FindWindow(g_val,NULL));


Re : Programme bloqué le 30/10/2004 23:20:16

aardman
Membre Club
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(...).

Re : Programme bloqué le 31/10/2004 02:07:19

goutbouyo
Membre Club
Tu as sans doute raison.

Je le met où alors le g_val ???
Dans un header ?

Re : Programme bloqué le 31/10/2004 02:36:28

aardman
Membre Club
Réponse acceptée !
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.

Re : Programme bloqué le 31/10/2004 02:40:28

aardman
Membre Club
Salut,
Le bout de code que j'ai donné plus haut est valable pour VC++/VS. Pour les autres je sais pas..

Re : Programme bloqué le 31/10/2004 10:31:06

goutbouyo
Membre Club
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.

Re : Programme bloqué le 31/10/2004 11:44:49

goutbouyo
Membre Club
Faut mettre quoi dans LINK.
J'ai vus sur MSDN qu'il fallait rajouter l'option /section mais j'y arrive pas ...


Classé sous : programme, code, wm, mb, hhk

Participer à cet échange

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
campagne Adwords
Budget : 5 000€
Boite echanges securis...
Budget : 500€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS