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

[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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

14 απαντήσεις σε αυτή την ερώτηση

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

  • 0

Παπί

 

Πραγματικά... βάλε Hackintosh και γράψε 10 γραμμές objective-c. 

 

 

Πραγματικά κάνε το και μετά πες μου. 

 

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Εάν δοκιμάσεις Objective-C τότε θα καταλάβεις τι έχανες τόσο καιρό. 

 

Ειλικρινά. 

 

Κακό κάνεις με το Win API. 

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Πραγματικά... βάλε Hackintosh και γράψε 10 γραμμές objective-c.

.

Η άχρηστη συμβουλή της ημέρας.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Δεν ειναι σπασμενο.

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/

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Δεν ειναι σπασμενο.

http://www.insomnia.gr/files/file/480-τρανζιστορ/

 

Σε μένα πάντως βγάζει: "Συγγνώμη, δεν έχετε άδεια γι 'αυτό!"

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Ίντα 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.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

meh.. δεν τους αρεσε και το βγαλανε...

Στο blog μου εκανα ενα ποστ.

http://tsokanoki.blogspot.gr/2013/09/audio-output-switcher.html

  • Like 1

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0
Δημοσ. (επεξεργασμένο)

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

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

Επεξ/σία από migf1

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

Εγγραφείτε για έναν νέο λογαριασμό

Σύνδεση

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

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

Χρήσιμες πληροφορίες

Με την περιήγησή σας στο insomnia.gr, αποδέχεστε τη χρήση cookies που ενισχύουν σημαντικά την εμπειρία χρήσης.