Προς το περιεχόμενο

[Share] Ενα προγραματακι που εφτιαξα.


παπι

Προτεινόμενες αναρτήσεις

Μετα την σουπερ ντουπερ κονσολα 3d console, λεω να βαλω και αυτο που εφτιαξα τωρα.

το προγραμα http://www.insomnia.gr/files/file/480-%CF%84%CF%81%CE%B1%CE%BD%CE%B6%CE%B9%CF%83%CF%84%CE%BF%CF%81/

 

ο κωδικας

#include <Windows.h>
#include <mmdeviceapi.h>
#include <functiondiscoverykeys_devpkey.h>
#include <vector>

#include "resource.h"

#define iffail(hr) if(FAILED(hr))
#define WM_TRAY		(WM_USER + 1)
#define IDM_EXIT	1
#define IDM_REFRESH 2


//den ein diko moy
//http://www.daveamenta.com/2011-05/programmatically-or-command-line-change-the-default-sound-playback-device-in-windows-7/
interface DECLSPEC_UUID("f8679f50-850a-41cf-9c72-430f290290c8") IPolicyConfig
	: public IUnknown
{
public:
	virtual HRESULT GetMixFormat(PCWSTR,WAVEFORMAT**);
	virtual HRESULT STDMETHODCALLTYPE GetDeviceFormat(PCWSTR,INT,WAVEFORMAT**);
	virtual HRESULT STDMETHODCALLTYPE ResetDeviceFormat(PCWSTR);
	virtual HRESULT STDMETHODCALLTYPE SetDeviceFormat(PCWSTR,WAVEFORMAT**,WAVEFORMAT**);
	virtual HRESULT STDMETHODCALLTYPE GetProcessingPeriod(PCWSTR,INT,PINT64,PINT64);
	virtual HRESULT STDMETHODCALLTYPE SetProcessingPeriod( PCWSTR,PINT64);
    virtual HRESULT STDMETHODCALLTYPE GetShareMode(PCWSTR,struct DeviceShareMode*);
    virtual HRESULT STDMETHODCALLTYPE SetShareMode(PCWSTR,struct DeviceShareMode*);
    virtual HRESULT STDMETHODCALLTYPE GetPropertyValue(PCWSTR,const PROPERTYKEY&, PROPVARIANT*);
    virtual HRESULT STDMETHODCALLTYPE SetPropertyValue(PCWSTR,const PROPERTYKEY&, PROPVARIANT*);
	//-->
    virtual HRESULT STDMETHODCALLTYPE SetDefaultEndpoint( __in PCWSTR wszDeviceId, __in ERole eRole);
    virtual HRESULT STDMETHODCALLTYPE SetEndpointVisibility(PCWSTR,INT);
};
class DECLSPEC_UUID("870af99c-171d-4f9e-af0d-e63df40c2bc9") CPolicyConfigClient;
//telos ref

//ayta ein dika moy


std::vector<std::pair<std::wstring,std::wstring>> g_devices;
std::wstring g_activeDeviceKey;
NOTIFYICONDATA g_tray;
HMENU g_popup;
int ScanSoundDevices();
int SetSoundDevice(const std::wstring& key);
HRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);


int WINAPI WinMain(HINSTANCE, HINSTANCE, PSTR,int)
{
	CoInitialize(0);
	ScanSoundDevices();
	HWND hWnd;
	MSG msg;
	WNDCLASSEX wc = { 0 };

	wc.cbSize				= sizeof(wc);
	wc.lpszClassName		= L"justawnd";
	wc.lpfnWndProc			= WndProc;

	RegisterClassEx(&wc);
	hWnd = CreateWindow(wc.lpszClassName,0,0,0,0,0,0,0,0,0,0);
	ShowWindow(hWnd,SW_HIDE);

	ZeroMemory(&g_tray,sizeof(g_tray));

	g_tray.cbSize			= sizeof(g_tray);
	g_tray.hWnd				= hWnd;
	g_tray.uID				= 1000;
	g_tray.uFlags			= NIF_ICON | NIF_MESSAGE ;
	g_tray.uCallbackMessage	= WM_TRAY;
	g_tray.hIcon			= (HICON)LoadImage(0,L"transistor-xl-small.ico",IMAGE_ICON,0,0,LR_LOADFROMFILE);
	
	Shell_NotifyIcon(NIM_ADD,&g_tray);
	while(GetMessage(&msg,0,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	Shell_NotifyIcon(NIM_DELETE, &g_tray);
	return 0;
}
int ScanSoundDevices()
{
	IMMDeviceEnumerator *pDevEnumerator = 0;
	IMMDeviceCollection *pDevCollection = 0;
	IMMDevice *pActiveDevice = 0;
	UINT devCount;

	iffail(CoCreateInstance(__uuidof(MMDeviceEnumerator),0,CLSCTX_ALL,__uuidof(IMMDeviceEnumerator),(void**) &pDevEnumerator))
	{
		return 1;
	}
	iffail(pDevEnumerator->EnumAudioEndpoints(eRender,DEVICE_STATE_ACTIVE,&pDevCollection))
	{
		pDevEnumerator->Release();
		return 1;
	}
	iffail(pDevCollection->GetCount(&devCount))
	{
		pDevCollection->Release();
		pDevEnumerator->Release();
		return 1;
	}
	//active device
	if(!FAILED(pDevEnumerator->GetDefaultAudioEndpoint(eRender,eConsole,&pActiveDevice)))
	{
		LPWSTR pActiveDevKey = 0;
		pActiveDevice->GetId(&pActiveDevKey);
		if(pActiveDevKey)
		{
			g_activeDeviceKey = pActiveDevKey;
			CoTaskMemFree(pActiveDevKey);
		}
		pActiveDevice->Release();
	}

	g_devices.clear();
	for(UINT i = 0 ; i < devCount; i++)
	{
		LPWSTR coDevID = 0;
		IMMDevice *pDevice = 0;

		if( !FAILED(pDevCollection->Item(i,&pDevice)) 
			&& pDevice)
		{
			IPropertyStore *pPropStore = 0;
			
			if( !FAILED( pDevice->GetId(&coDevID))
				&& !FAILED( pDevice->OpenPropertyStore(STGM_READ,&pPropStore)) 
				&& coDevID )
			{
				PROPVARIANT devName;
				PropVariantInit(&devName);
				pPropStore->GetValue(PKEY_Device_FriendlyName,&devName);
				//key name
				g_devices.push_back(std::pair<std::wstring,std::wstring>(coDevID,devName.pwszVal) );
				PropVariantClear(&devName);
				CoTaskMemFree(coDevID);
			}
			pDevice->Release();
		}
	}

	pDevCollection->Release();
	pDevEnumerator->Release();
	return 0;
}

int SetSoundDevice(const std::wstring& key)
{
	IPolicyConfig *pConfing = 0;
	int result = 0;
	iffail(CoCreateInstance(__uuidof(CPolicyConfigClient), 0, CLSCTX_ALL, __uuidof(IPolicyConfig), (void**)&pConfing))
		return 1;
	iffail(pConfing->SetDefaultEndpoint(key.c_str(), eConsole))
		result = 1;
	g_activeDeviceKey = key;
	pConfing->Release();

	return result;
}
HRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch(msg)
	{
	case WM_COMMAND:
		if( !HIWORD(wParam) )
		{
			if(wParam == IDM_EXIT)
				PostQuitMessage(0);
			else if(wParam == IDM_REFRESH)
				ScanSoundDevices();
			else if(wParam > 2 && wParam <= g_devices.size() + 2)
				SetSoundDevice(g_devices[wParam-3].first);
		}
		break;
	case WM_TRAY:
		if(lParam == WM_RBUTTONDOWN || lParam == WM_LBUTTONDOWN)
		{
			POINT p;
			GetCursorPos(&p);
			if(g_popup)
			{
				DestroyMenu(g_popup);
				g_popup = 0;
			}
			g_popup = CreatePopupMenu();
			//dynamiko menu
			for(UINT i = 0; i < g_devices.size(); i++)
			{
				int flag = MF_STRING;
				if(!g_devices[i].first.compare(g_activeDeviceKey ))
					flag |= MF_CHECKED;
				AppendMenu(g_popup, flag, i + 3, g_devices[i].second.c_str());
			}
			AppendMenu(g_popup, MF_SEPARATOR,0,0);
			AppendMenu(g_popup, MF_STRING, IDM_REFRESH, L"Refresh Drivers");
			AppendMenu(g_popup, MF_STRING, IDM_EXIT, L"Exit");
			
			
			TrackPopupMenu(g_popup, TPM_NONOTIFY,p.x,p.y,0,hWnd,0);
		
		}
		break;
	default:
		return DefWindowProc(hWnd,msg,wParam,lParam);
	}
	return 0;
}

κλασικα, βιτσιοζος με winapi.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ίντα fuck ωρε;



index.php?app=downloads&module=display&s
Για εμας που εχουμε περισσοτερα audio output, και βαριομαστε να πηγαινουμε control panel-> hardware -> sound -> set defualt καθε τρεις και λιγο. Εφτιαξα ενα προγραμμα το οποιο τεχει στο tray (κατω δεξια) και κανει αυτη την δουλεια για εμας.

Βασικα για παρτυ μου το εφτιαξα, αλλα λεω ας το μοιραστω.

ΠΡΟΣΟΧΗ! Χρησιμοποιω undocumented API, το οποιο σημαινει οτι δουλευει ΜΟΝΟ σε win7. (μπορει να δουλευει και σε 8)

ΥΓ: Στο Website εβαλα το blog μου το οποιο ειναι ασχετο με το προγραμμα, αλλα επειδη απαιτειται ενα website... το εβαλα.

Τι είναι Καινούριο σ'αυτή την Έκδοση 1.0.0.0.0002 (2o build) (Εμφάνιση όλων των αλλαγών)
  • Καμια. Alpha version.
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αν το τρέξω σε XP θα πάθω μεγάλο... κακό;

Τι κακο να παθεις; Το πολυ πολυ να κανει bind στο γαμο του καραγκιοζη χεχεχε

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Τι κακο να παθεις; Το πολυ πολυ να κανει bind στο γαμο του καραγκιοζη χεχεχε

Χεχε, οκ θα το δοκιμάσω μόλις τελειώσω κάτι πρότζεκτς που κάνω σε XP (δεν το ρισκάρω νωρίτερα) ... γιατί όμως δεν το κάνεις να τρέχει και σε XP;

Επεξ/σία από migf1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...