winapi ile systray ve cdrom kontrolu
Ekteki kod, Tarık Kranda arkadaşımızın gönderdiği iskelet WINAPI kodundan yola çıkılarak yazılmıştır. Programda 2 temel Windows API' si kullanılarak CDROM kontrolü ve system tray'e bilgilendirme ikonu yerleştirme işlemleri yapılmaktadır.
gönderen: spino
/*
Aşağıdaki kod Visual C++ 6.0 IDE'si ile yazılıp derlenmiştir.

CDROM komutları için winmm.dll deki mciSendString API'si ,
System Tray'e ikon eklemek için shell32.dll deki Shell_NotifyIcon API'si kullanılmıştır.

Windows API'ler hakkında daha fazla bilgi http://www.pinvoke.net/ adresinden temin edilebilir.

C++ ile form nesneleri oluşturmak için http://www.csharpnedir.com/makalegoster.asp?MId=610
adresinden faydalanılabilir
*/

#pragma comment(lib, "winmm.lib") //cdrom'a komutları yollayacağımız fonksiyonlar için açıldı
#pragma comment(lib, "shell32.lib") //system tray'de durum ikonu göstermek için açıldı

#include "windows.h" //windows pencere sınıfı için açıldı

#define IDacbuton 10 //Kapak açan butonun hookitemID'si
#define IDkapatbuton 11 //Kapak kapatan butonun hookitemID'si

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
//ana pencerede yapılan işlemlere (yollanan mesajlara) yanıt veren fonksiyon

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszCmdParam,int nCmdShow)
{
WNDCLASS wndClass; //açılacak pencerenin üyesi olacağı pencere sınıfı
HWND hWnd; //açılacak pencere için tutamaç
MSG message; //pencerede oluşan olaylar için mesaj değişkeni

if (!hPrevInstance) //Pencere sınıfımıza istediğimiz özellikleri aktarıyoruz
{
wndClass.style = CS_HREDRAW | CS_VREDRAW;
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.hInstance = hInstance;
wndClass.hIcon = LoadIcon(0, IDI_ASTERISK); //pencere ikonu
wndClass.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(212,208,200)); //pencere arka plan rengi
wndClass.hCursor = LoadCursor(NULL,IDC_ARROW); //pencere için mouse ikonu
wndClass.lpszMenuName = NULL;
wndClass.lpszClassName = "CDROM"; //pencere sınıfımızın adı
wndClass.lpfnWndProc = (WNDPROC)WndProc; //bu pencere sınıfıyla tanımlı pencerenin olaylarını işleyecek fonksiyon

if (!RegisterClass(&wndClass)) //sınıf kaydedilir
return -1;
}

hWnd = CreateWindow("CDROM", //pencere sınıfımızın adını vererek istediğimiz tipte bir pencere alıyoruz
"CDROM Kontrol Programı", //pencere başlığı
WS_OVERLAPPEDWINDOW,
250, //sol mesafe
250, //üst mesafe
280, //genişlik
100, //yükseklik
NULL, //ebeveyn pencere olmadığı için ebeveyn tutamaç da söz konusu değildir.
NULL,
hInstance,
NULL);

if (!hWnd) //pencere oluşturulamazsa
return -1;

ShowWindow(hWnd,SW_RESTORE); //pencere ekrana konur
UpdateWindow(hWnd);

while(GetMessage(&message,0,0,0)) //pencerede oluşan olayları dinleyen döngü
{
TranslateMessage(&message);
DispatchMessage(&message);
}

return (message.wParam);
}


LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
//pencerede oluşan olaylara cevap veren fonksiyon

NOTIFYICONDATA tray; //trayde gösterilecek ikon için açılan nesne

tray.cbSize=sizeof(NOTIFYICONDATA); //nesneye boyutu verilir
tray.hWnd=hWnd; //bu ikon nesnesi fonksiyonun parametre olarak aldığı hWnd nolu tutamacın sahibi olan pencereyle bağımlıdır
//bu şekilde traydeki olaylar penceremize iletilebilecek
tray.uID=100; //bir pencerenin birden fazla tray ikonu olabilir. Bu programda 1 tane kullanılacağından önemli değil
strcpy(tray.szTip,""); //ikonun üstüne gelindiğinde gözüken metin ayarlanır (başlangıçta boştur)
tray.hIcon=LoadIcon(0,IDI_ASTERISK); //ikonun sembolü ayarlanır
tray.uCallbackMessage = WM_APP + 100;
tray.uFlags=NIF_MESSAGE | NIF_ICON | NIF_TIP ; //ikonun görünüm tipiyle ilgili (mesaj + ikon + baloontip)

HWND hacbuton,hkapatbuton; //CDROM kapağını açan ve kapatan butonlar için tutamaç

switch(message) //pencereden gelen mesaj alınır
{
case WM_CREATE: //pencere yaratılıyorsa
{
//CDROM açma butonu da yaratılıp pencereye eklenir
hacbuton = CreateWindow( "button", //button sınıfından bir nesne
"Kapağı Aç", //buton metni
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
20, //sol mesafe
20, //üst mesafe
100, //genişlik
30, //yükseklik
hWnd, //butonun ebeveyni olan aa pencerenin tutamaçı
(HMENU)IDacbuton, //butonun oluşan olaylarda kendisini ayırt etmekte kullanılan ID'si (hookitemID)
((LPCREATESTRUCT)lParam)->hInstance,
NULL);

//CDROM kapatma butonu da yaratılıp pencereye eklenir
hkapatbuton = CreateWindow( "button",
"Kapağı Kapat",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
160,
20,
100,
30,
hWnd,
(HMENU)IDkapatbuton,
((LPCREATESTRUCT)lParam)->hInstance,
NULL);

Shell_NotifyIcon(NIM_ADD,&tray);
//Fonksiyon başında özellikleri ayarlanan tray ikonu masaüstünün sağ alt kısmında yerini alır
break;
}

case WM_COMMAND: //Bir komut olayı oluşmuşsa
{
//wParam değerinin düşük anlamlı kısmı olayın kaynağının hookitemID'sini tutar

if(LOWORD(wParam)==IDacbuton) //olayın kaynağı CDROM kapağı açma butonu ise
{
mciSendString("Set cdaudio door open",0,0,0);
//winmm.dll de tanımlı mciSendString API'sine default CDROM'un kapağını açması söylenir.
strcpy(tray.szTip,"CDROM açıldı");
//system tray'de gösterilen ikonun metni "CDROM açıldı" şeklinde düzenlenir
}
else if(LOWORD(wParam)==IDkapatbuton)
{
mciSendString("Set cdaudio door closed",0,0,0);
//winmm.dll de tanımlı mciSendString API'sine default CDROM'un kapağını kapatması söylenir.
strcpy(tray.szTip,"CDROM kapandı");
//system tray'de gösterilen ikonun metni "CDROM kapandı" şeklinde düzenlenir
}
//system traydeki ikonun metnini düzenledikten sonra söz konusu ikonu aşağıdaki gibi güncellemek gerekir.
Shell_NotifyIcon(NIM_MODIFY,&tray);

break;
}

case WM_DESTROY: //Pencere kapatılmak isteniyorsa
{
Shell_NotifyIcon(NIM_DELETE,&tray);
//system traye konan ikon silinir
PostQuitMessage(0);
//pencere kaldırılır
break;
}

default:return DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}