Wyciszenie programu Win7/8

0

Witam
Chciałbym się zapytać czy wie ktoś z was jak wyciszyć cały głoś dla swojej aplikacji? Robie to tak, to miało niby działać ale nie działa

SendMessageW(Handle, WM_APPCOMMAND, (unsigned int)Handle, APPCOMMAND_VOLUME_MUTE);

Programuje w C++BuilderXE7 Starter sprawdzałem także na C++Builder 6.
Mam Win8 dziwna sprawa.

1

Nie wiem jak w XE7 ale z tego co widzę w 6 APPCOMMAND_VOLUME_MUTE ma nieprawidłową wartość i trzeba to skorygować:

   #if defined(APPCOMMAND_VOLUME_MUTE)
        # undef APPCOMMAND_VOLUME_MUTE
   #endif APPCOMMAND_VOLUME_MUTE
   const int APPCOMMAND_VOLUME_MUTE = 0x80000;

Jednak to NIE jest sposób na wyciszenia dźwięku dla danej aplikacji a całego systemu. W temacie http://4programmers.net/Forum/Delphi_Pascal/153962-jak_wylaczycwyciszyc_dzwiek_w_programie podawałem kod jak to zrobić tylko dla danego programu. Kod jest w Delphi ale na pewno da się przetłumaczyć na C++Builder.

0

No tak przepisałem sobie ten kod ale dostaje błąd podczas linkowania, jakby jakiegoś pliku lib brakowało może wiesz jakiego?

 
IMMDevice *lpDefDev = NULL;
	IMMDeviceEnumerator *lpDevEnum = NULL;
	IAudioSessionManager *lpSesMgr = NULL;
	IAudioSessionControl *lpSesControl = NULL;
	ISimpleAudioVolume *lpAudioVol = NULL;

	long hr;
	float VolumeLevel = 0.5;

	hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator), (void**)lpDevEnum);
	if( SUCCEEDED(hr) && (lpDevEnum != NULL) )
	{
		hr = lpDevEnum->GetDefaultAudioEndpoint(0,0, &lpDefDev);
		if(SUCCEEDED(hr) && (lpDefDev != NULL))
		{
			//hr = lpDefDev->Activate(IID_IAudioSessionManager, CLSCTX_ALL, NULL, (void**)&lpSesMgr);
			hr = lpDefDev->Activate(IID_IAudioSessionManager, CLSCTX_ALL, NULL, (void**)&lpSesMgr);
			if(SUCCEEDED(hr) && (lpSesMgr != NULL))
			{
				hr = lpSesMgr->GetAudioSessionControl(&GUID_NULL, 0, &lpSesControl);
				if(SUCCEEDED(hr) && (lpSesControl != NULL))
				{
					hr = lpSesControl->QueryInterface(IID_ISimpleAudioVolume, (void**)&lpAudioVol);
					if(SUCCEEDED(hr) && (lpAudioVol != NULL))
					{
						ShowMessage("ok");
						lpAudioVol->SetMute(true, NULL);
						lpAudioVol->Release();
					}

					lpSesControl->Release();
				}
				lpSesMgr->Release();
			}
			lpDefDev->Release();
		}
		lpDevEnum->Release();
	}
0

Dostaje unresolved external

[ilink32 Error] Error: Unresolved external '_IID_IAudioSessionManager' referenced from C:\USERS\PIOTREK\DOCUMENTS\EMBARCADERO\STUDIO\PROJECTS\WIN32\DEBUG\UNIT1.OBJ
[ilink32 Error] Error: Unresolved external '_IID_ISimpleAudioVolume' referenced from C:\USERS\PIOTREK\DOCUMENTS\EMBARCADERO\STUDIO\PROJECTS\WIN32\DEBUG\UNIT1.OBJ

0

To trochę nie moja działka, bo nigdy zbyt dogłębnie nie bawiłem się tak ale...
Używałeś Spy++ czy innego programu podglądającego jakiego rodzaju wiadomości dostaje aplikacja? Dostaniesz wszystkie wartości jakich potrzebujesz do wywołania tego + to nie musi być SendMessage a PostMessage - musisz to sprawdzić.

Są też inne programy niż Spy++ (on akurat jest w pakiecie z VS Ultimate iirc)

  • głupia sugestia (nie bierz do siebie): Program jest odpalony z uprawnieniami administratora? Czasem może być to wymagane, bawiłem się wysyłaniem wiadomości do aplikacji, ale nie wiem jak to jest w Twoim przypadku
0

Tak dzięki sprawdzałem prawa admina bo nieźle namieszali z tym w 7 i 8.
Wysyłanie wiadomości działa ponieważ sprawdzałem, poza tym jak podam NULL zamiast 2 parametru to wycisza ale wszystko.

0

Chodziło mi o drugi uchwyt nie parametr. Czyli parametr 4

1 użytkowników online, w tym zalogowanych: 0, gości: 1