Bonjour,
Je suis en train de faire un programme qui permet de gérer des applications via une télécommande.
Cela veut dire que suivant l'application qui a la main, j'envoie au système des ordres de type clavier ou souris.
Ou alors certaines touches sont utilisées comme des raccourcis pour lancer une application ou lui donner la main si elle est déjà exécutée.

Mon problème se situe pour l'explorateur windows :
J'utilise la fonction EnumWindows() pour rechercher si une fenêtre de l'explorateur est ouverte.

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
BOOL CALLBACK CTelUSBView::EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
	LPWSTR str_c = new _TCHAR[100];
	HANDLE c=NULL;
	DWORD* prhnd= new DWORD;
	DWORD* lng =new DWORD(100);
    LPWSTR nom=(LPWSTR)lParam;
	//Acquisition du chemin du processus
	GetWindowThreadProcessId(hwnd,prhnd);
	c=OpenProcess(PROCESS_QUERY_INFORMATION,TRUE,*prhnd);
	QueryFullProcessImageName(c,0,str_c,lng);
	CloseHandle(c);
	//Comparaison
	if(_tcscmp(_T("C:\\Windows\\explorer.exe"),str_c)==0)
	{
		::PostMessage(hwnd,WM_SYSCOMMAND,SC_CLOSE,0);
	}
	else
	{
		if(_tcscmp(nom,str_c)==0)
		{	
			if(::SetForegroundWindow(hwnd)==NULL)
			{
				CString tmp;
				tmp.Format(_T("Erreur N°%d"),GetLastError());
				AfxMessageBox(tmp,MB_OK|MB_ICONSTOP);
			}
			return FALSE;
		}
	}
	return TRUE;
 
}
J'enumère toutes les fenêtres, regarde quel processus à ouvert la fenêtre et recherche la chaîne C:\Windows\explorer.exe. Si je la trouve, je met la fenêtre en avant plan.
Mon problème est que le processus est trouvé mais que la fenêtre n'est pas mise en avant plan.
Par contre pour les autres applications, cela marche sans problème.
Je ne suis pas assez spécialiste en api windows pour situer le problème et un petit coup de main ne serai pas de refus.

Deuxième point, lorsque je donne la main moi même à l'explorateur, j'essaie de simuler l'appuie de touche clavier par :
- Prend le handle de la fenêtre active :
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
LPWSTR str_c = new _TCHAR[100];
			HWND hwnd_a=::GetForegroundWindow();
			HANDLE c=NULL;
			DWORD* prhnd= new DWORD;
			DWORD* lng =new DWORD(100);
			GetWindowThreadProcessId(hwnd_a,prhnd);
			c=OpenProcess(PROCESS_QUERY_INFORMATION,TRUE,*prhnd);
			if(c!=NULL)
			{
				QueryFullProcessImageName(c,0,str_c,lng);
				if(_tcscmp(str_c,ch_audio)==0)
					AppBtn(Donnee[0],&Btn_Son,hwnd_a);
				else if(_tcscmp(str_c,ch_video)==0)
					AppBtn(Donnee[0],&Btn_Video,hwnd_a);
				else if(_tcscmp(str_c,ch_explorateur)==0)
					AppBtn(Donnee[0],&Btn_Expl,hwnd_a);				
			}
			CloseHandle(c);
-envoie les requète clavier :
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
void CTelUSBView::AppBtn(int i, CBoutonArray *mem, HWND fenetre)
{
	int j=0;
	UINT VK_SK=0,VK_KC=0;
	for(j=0;j<(*mem).GetSize();j++)
	{
		if((*mem)[j].Id_Btn==i)
			break;
	}
	if(j==(*mem).GetSize())
		return;
	//Action
	VK_KC=MapVirtualKey((*mem)[j].Key_Code,0);
	if((*mem)[j].ShiftKey!=0)
	{
		VK_SK=MapVirtualKey((*mem)[j].ShiftKey,0);
		::keybd_event((*mem)[j].ShiftKey,VK_SK,0,0);
		::keybd_event((*mem)[j].Key_Code,VK_KC,0,0);
		::keybd_event((*mem)[j].ShiftKey,VK_SK,KEYEVENTF_KEYUP,0);
		::keybd_event((*mem)[j].Key_Code,VK_KC,KEYEVENTF_KEYUP,0);
	}
	else
	{
		::keybd_event((*mem)[j].Key_Code,VK_KC,0,0);
		::keybd_event((*mem)[j].Key_Code,VK_KC,KEYEVENTF_KEYUP,0);
	}
}
Cette fonction recherche les codes clavier et les envoie par la fonction keybd_event. Le problème est le même, cela marche pour toutes les applications sauf pour l'explorateur windows.

Je pense que les deux problèmes sont identiques et proviennent de la capture du handle qui n'est pas bonne.

Malheureusement, je n'arrive pas à trouver la solution.
Merci pour vos aides.