παπι Δημοσ. 24 Σεπτεμβρίου 2013 Δημοσ. 24 Σεπτεμβρίου 2013 Μετα την σουπερ ντουπερ κονσολα 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. 1
Timonkaipumpa Δημοσ. 25 Σεπτεμβρίου 2013 Δημοσ. 25 Σεπτεμβρίου 2013 Παπί Πραγματικά... βάλε Hackintosh και γράψε 10 γραμμές objective-c. Πραγματικά κάνε το και μετά πες μου.
παπι Δημοσ. 25 Σεπτεμβρίου 2013 Μέλος Δημοσ. 25 Σεπτεμβρίου 2013 Γιατι να καναω κακο στον εαυτο μου βρε τιμο;
Timonkaipumpa Δημοσ. 25 Σεπτεμβρίου 2013 Δημοσ. 25 Σεπτεμβρίου 2013 Εάν δοκιμάσεις Objective-C τότε θα καταλάβεις τι έχανες τόσο καιρό. Ειλικρινά. Κακό κάνεις με το Win API.
marios_geo Δημοσ. 27 Σεπτεμβρίου 2013 Δημοσ. 27 Σεπτεμβρίου 2013 Πραγματικά... βάλε Hackintosh και γράψε 10 γραμμές objective-c. . Η άχρηστη συμβουλή της ημέρας.
nilosgr Δημοσ. 27 Σεπτεμβρίου 2013 Δημοσ. 27 Σεπτεμβρίου 2013 και τι κανει;; δε μας λες... (το λινκ ειναι σπασμενο)
παπι Δημοσ. 27 Σεπτεμβρίου 2013 Μέλος Δημοσ. 27 Σεπτεμβρίου 2013 Δεν ειναι σπασμενο. 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/
migf1 Δημοσ. 27 Σεπτεμβρίου 2013 Δημοσ. 27 Σεπτεμβρίου 2013 Δεν ειναι σπασμενο. http://www.insomnia.gr/files/file/480-τρανζιστορ/ Σε μένα πάντως βγάζει: "Συγγνώμη, δεν έχετε άδεια γι 'αυτό!"
παπι Δημοσ. 27 Σεπτεμβρίου 2013 Μέλος Δημοσ. 27 Σεπτεμβρίου 2013 Ίντα fuck ωρε; Για εμας που εχουμε περισσοτερα 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.
migf1 Δημοσ. 27 Σεπτεμβρίου 2013 Δημοσ. 27 Σεπτεμβρίου 2013 Βάλτο κάπου που να μπορούμε να το κατεβάσουμε.
παπι Δημοσ. 27 Σεπτεμβρίου 2013 Μέλος Δημοσ. 27 Σεπτεμβρίου 2013 Στα file το εβαλα, που ναξερα οτι ειναι "private".
παπι Δημοσ. 28 Σεπτεμβρίου 2013 Μέλος Δημοσ. 28 Σεπτεμβρίου 2013 meh.. δεν τους αρεσε και το βγαλανε... Στο blog μου εκανα ενα ποστ. http://tsokanoki.blogspot.gr/2013/09/audio-output-switcher.html 1
migf1 Δημοσ. 29 Σεπτεμβρίου 2013 Δημοσ. 29 Σεπτεμβρίου 2013 Αν το τρέξω σε XP θα πάθω μεγάλο... κακό;
παπι Δημοσ. 29 Σεπτεμβρίου 2013 Μέλος Δημοσ. 29 Σεπτεμβρίου 2013 Αν το τρέξω σε XP θα πάθω μεγάλο... κακό; Τι κακο να παθεις; Το πολυ πολυ να κανει bind στο γαμο του καραγκιοζη χεχεχε
migf1 Δημοσ. 29 Σεπτεμβρίου 2013 Δημοσ. 29 Σεπτεμβρίου 2013 (επεξεργασμένο) Τι κακο να παθεις; Το πολυ πολυ να κανει bind στο γαμο του καραγκιοζη χεχεχε Χεχε, οκ θα το δοκιμάσω μόλις τελειώσω κάτι πρότζεκτς που κάνω σε XP (δεν το ρισκάρω νωρίτερα) ... γιατί όμως δεν το κάνεις να τρέχει και σε XP; Επεξ/σία 29 Σεπτεμβρίου 2013 από migf1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα