// Komunikaty2Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "Komunikaty2.h"
#include "Komunikaty2Dlg.h"

#include <dbt.h>

DEFINE_GUID(GUID_DEVINTERFACE_DISK,                   0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_CDROM,                  0x53f56308L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_PARTITION,              0x53f5630aL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_TAPE,                   0x53f5630bL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_WRITEONCEDISK,          0x53f5630cL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_VOLUME,                 0x53f5630dL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_MEDIUMCHANGER,          0x53f56310L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_FLOPPY,                 0x53f56311L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_CDCHANGER,              0x53f56312L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_STORAGEPORT,            0x2accfe60L, 0xc130, 0x11d2, 0xb0, 0x82, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_USBSTOR,				  0xa5dcbf10L, 0x6530, 0x11d2, 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed);

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CKomunikaty2Dlg dialog




CKomunikaty2Dlg::CKomunikaty2Dlg(CWnd* pParent /*=NULL*/)
	: CDialog(CKomunikaty2Dlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CKomunikaty2Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_CHECK1, checkBox1);
	DDX_Control(pDX, IDC_LIST1, listBox1);
}

BEGIN_MESSAGE_MAP(CKomunikaty2Dlg, CDialog)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDC_BUTTON1, &CKomunikaty2Dlg::OnBnClickedButton1)
	ON_WM_SYSCOMMAND()
	ON_WM_QUERYENDSESSION()
	ON_WM_DEVICECHANGE()
	ON_BN_CLICKED(IDC_BUTTON2, &CKomunikaty2Dlg::OnBnClickedButton2)
	ON_BN_CLICKED(IDC_BUTTON3, &CKomunikaty2Dlg::OnBnClickedButton3)
	ON_BN_CLICKED(IDC_BUTTON4, &CKomunikaty2Dlg::OnBnClickedButton4)
//	ON_WM_DROPFILES()
END_MESSAGE_MAP()


// CKomunikaty2Dlg message handlers


BOOL CKomunikaty2Dlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	static const GUID GUID_DEVINTERFACE_USBSTOR = { 0xa5dcbf10, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };
	DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
    ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );
    NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
    NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
    NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_USBSTOR;
	//NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_CDROM;
	HDEVNOTIFY hDevNotify=RegisterDeviceNotification(this->m_hWnd,&NotificationFilter,DEVICE_NOTIFY_WINDOW_HANDLE);
	if (hDevNotify==NULL) listBox1.AddString(L"Nie udało się zarejestrować aplikacji do otrzymywaniu powiadomień o pamięci USB");
	else listBox1.AddString(L"Aplikacja została zarejestrowana do otrzymywania powiadomień o pamięci USB");

	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CKomunikaty2Dlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CKomunikaty2Dlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}


void CKomunikaty2Dlg::OnBnClickedButton1()
{
	//::SendMessage(this->m_hWnd,WM_SYSCOMMAND,SC_SCREENSAVE,0);
	this->SendMessage(WM_SYSCOMMAND,SC_SCREENSAVE,0);
	//Perform
}

void CKomunikaty2Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if(nID==SC_SCREENSAVE) Beep(100,100);

	CDialog::OnSysCommand(nID, lParam);
}

BOOL CKomunikaty2Dlg::OnQueryEndSession()
{
	if (!CDialog::OnQueryEndSession())
		return FALSE;

	Beep(100,100);

	return (checkBox1.GetState() & 0x0003)==0;
}

LRESULT CKomunikaty2Dlg::WindowProc(UINT message,WPARAM wParam,LPARAM lParam)
{
	if(message==WM_DEVICECHANGE && listBox1.m_hWnd!=NULL)
	{
		CString s;
		switch(wParam)
		{
			case DBT_DEVICEARRIVAL: s.Append(L"Włożony nośnik"); break;
			case DBT_DEVICEQUERYREMOVE: s.Append(L"Pytanie o możliwość usunięcia nośnika"); break;
			case DBT_DEVICEQUERYREMOVEFAILED: s.Append(L"Prośba o możliwość usunięcia nośnika została anulowana"); break;
			case DBT_DEVICEREMOVEPENDING: s.Append(L"Nośnik zostanie usunięty"); break;
			case DBT_DEVICEREMOVECOMPLETE: s.Append(L"Usuwanie nośnika zostało zakończone"); break;
			case DBT_DEVICETYPESPECIFIC: s.Append(L"Zdarzenie specyficzne dla danego urządzenia"); break;
			case DBT_CONFIGCHANGED: s.Append(L"Bieżąca konfiguracja urządzenia zostałą zmieniona"); break;
			case DBT_DEVNODES_CHANGED: s.Append(L"Węzeł urządzenia został zmieniony"); break;
 		}
		listBox1.AddString(s);
	}

	return CDialog::WindowProc(message,wParam,lParam);
}

#include <dbt.h>
BOOL CKomunikaty2Dlg::OnDeviceChange(UINT nEventType,DWORD_PTR dwData)
{
	CString s;
	switch(nEventType)
	{
		case DBT_DEVICEARRIVAL: s.Append(L"Włożony nośnik"); break;
		case DBT_DEVICEQUERYREMOVE: s.Append(L"Pytanie o możliwość usunięcia nośnika"); break;
		case DBT_DEVICEQUERYREMOVEFAILED: s.Append(L"Prośba o możliwość usunięcia nośnika została anulowana"); break;
		case DBT_DEVICEREMOVEPENDING: s.Append(L"Nośnik zostanie usunięty"); break;
		case DBT_DEVICEREMOVECOMPLETE: s.Append(L"Usuwanie nośnika zostało zakończone"); break;
		case DBT_DEVICETYPESPECIFIC: s.Append(L"Zdarzenie specyficzne dla danego urządzenia"); break;
		case DBT_CONFIGCHANGED: s.Append(L"Bierząca konfiguracja urządzenia zostałą zmieniona"); break;
		case DBT_DEVNODES_CHANGED: s.Append(L"Węzeł urządzenia został zmieniony"); break;
 	}
	//listBox1.AddString(s);
	return TRUE;
}

void CKomunikaty2Dlg::OnBnClickedButton2()
{
	::SendMessage(::FindWindow(L"Winamp v1.x",NULL),WM_COMMAND,40045,0); //Odtwarzaj
}

void CKomunikaty2Dlg::OnBnClickedButton3()
{	
	::SendMessage(::FindWindow(L"Winamp v1.x",NULL),WM_COMMAND,40048,0); //Nastepny utwor
}

void CKomunikaty2Dlg::OnBnClickedButton4()
{
	::SendMessage(::FindWindow(L"Winamp v1.x",NULL),WM_COMMAND,40047,0); //Stop
}
