Agustus 30, 2012

Sedikit Tentang Bagaimana dan Untuk apa Menggunakan Windows API


Membuat program pada sistem Windows dengan .NET membuat semua proses menjadi lebih mudah. Misalnya pada IDE Microsoft Visual Studio 2008 Express (yang gratis), programmer dimanjakan dengan segala fasilitas secara visual. Namun adakalanya program yang kita buat, ingin berinteraksi dengan sistem windows untuk melakukan proses yang berhubungan dengan sistem. Sebut saja misalnya: mengatur volume suara, sleep atau hibernate komputer, menentukan apakah program lain sedang aktif, menutup program lain apabila aktif, dan lain-lain. Inilah saatnya program kita memerlukan Windows API.

Ada hal mendasar yang perlu diketahui untuk dapat menggunakannya. Bagi anda yang baru dalam hal Windows API dan anda menggunakan Visual Basic, mari kita coba pahami dasar – dasar penggunaannya.

Kalaupun contoh diatas dapat dilakukan tanpa Windows API, proses yang dilakukan biasanya lenih panjang dan menimbulkan banyak dependency. Bagi programmer Visual C++, interaksi dengan API sedikit lebih mudah karena semua objek yang diperlukan terkadang cukup dengan satu deklarasi. Untuk Visual Basic .NET bagian yang penting untuk dipahami adalah deklarasi konstan dan tipe data. Kita ambil contoh misalkan ingin program yang dapat menutup program lain: misalnya menutup program Calculator bawaan Windows.

API yang diperlukan adalah:
  • FindWindow, untuk mendapatkan handle window target.
  • SendMessage, untuk menutup window target (melalui konstan WM_CLOSE).
Implementasi pada Visual C++, misalnya sebagai berikut:
C++
Pada bagian deklarasi cukup dituliskan:
#include <windows.h>
 Pada sebuah function tuliskan:
 void myFunc()
{
     HWND hwnd = FindWindow(NULL, L"Calculator");
     SendMessage(hwnd, WM_CLOSE, 0,0);
 }

Mari kita bandingkan implementasinya pada VB .NET.  Kurang-lebihnya seperti ini:
VB.NET
1. Pada bagian deklarasi dituliskan konstan dan Windows API yang dipakai.
Const WM_CLOSE = &H10

Declare Auto Function FindWindow Lib "User32" (ByVal ClassName As String, ByVal WindowName As String) As IntPtr

Declare Auto Function SendMessage Lib "user32.dll" _
(ByVal hWnd As IntPtr, ByVal msg As Integer,  ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
2. Pada sebuah procedure vb.NET tuliskan:
Sub myFunc()
    Dim wnd As IntPtr = FindWindow(vbNullString, "Calculator")
    Dim res As IntPtr = SendMessage(wnd, WM_CLOSE, 0, 0)  
End Sub
Langkah yang ditempuh pada VB .net dapat diuraikan sebagai berikut:
Pada Visual C++, Konstan WM_CLOSE tidak perlu deklarasi karena sudah mendefinisikannya sebagai hexa 0x0010. Sedangkan pada vb.NET harus dideklarasikan dengan nilai hexa &H10.

1. Kita perlu deklarasi Windows API yang akan digunakan (dalam hal ini FindWindow)

Declare Auto Function FindWindow Lib "User32" (ByVal ClassName As String, ByVal WindowName As String) As IntPtr

Penjelasannya:
FindWindow digunakan untuk mengambil handle sebuah program, dengan syarat program tersebut memiliki tampilan/window. Handle adalah teknik Windows meng-alokasikan memori sedemikian sehingga sebuah program dapat dikelola hanya dengan mendapatkan handle-nya.

Jika dipenggal penjelasannya:

Declare Auto Function FindWindow Lib "User32"
FindWindow adalah sebuah function didalam library User32.dll, yang dapat kita panggil dengan menyebutkan (Declare) nama Function-nya (tanpa perlu mencari lokasi memori entry-point). Sehingga kita hanya perlu deklarasi auto function dengan menyebutkan FindWindow sebagai nama entry-point pada User32.dll, itulah Declare Auto Function FindWindow Lib "User32".

(ByVal ClassName As String, ByVal WindowName As String)
FindWindow memiliki 2 parameter input yaitu ClassName dan WindowName yang keduanya ber-tipe String. Didalam dokumentasi FindWindow, disebutkan bahwa parameter ini bersifat Optional, yang artinya dapat diisi dengan nilai kosong sesuai tipe datanya. Nilai kosong untuk tipe String pada Visual basic .NET adalah vbNullString. Dalam hal sebuah program memiliki teks caption window (mis: pada program Calculator, Caption-nya adalah Calculator), kita hanya perlu mengisikan Caption Window tersebut sebagai parameter WindowName, sedangkan parameter ClassName dapat dikosongkan (vbNullString). Jika kedua parameter diisi vbNullString, maka window pertama ditemukan yang akan diambil handle-nya.

As IntPtr
FindWindow adalah function dengan struktur data yang didefinisikan sebagai HWND. Artinya FindWindow memerlukan alokasi memori ber-struktur HWND. HWND didefinisikan dalam pemrograman C++, didalam vb.NET tidak ada definisi untuk HWND. Untuk ini dipakailah struktur unik yang disediakan .NET yaitu IntPtr. IntPtr didalam visual basic .Net adalah alokasi memori yang khusus diperuntukkan kepada handle dan pointer.


2. Setelah handle didapatkan, lanjutkan dengan menutup program tersebut (SendMessage dan WM_CLOSE).

Const WM_CLOSE = &H10

Declare Auto Function SendMessage Lib "user32.dll" _
(ByVal hWnd As IntPtr, ByVal msg As Integer,  ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr


Parameter:
hWnd adalah handle window target.
msg adalah Message yang diinginkan.
wParam adalah struktur data khusus sebagai pengaturan tambahan (optional jika diperlukan)
lParam adalah struktur data khusus sebagai pengaturan tambahan (optional jika diperlukan)

hwnd kita supply dengan handle hasil FindWindow
msg kita supply dengan WM_CLOSE (dari sekian banyak Message, WM_CLOSE adalah konstan untuk menutup window)
wParam dan lParam tidak diperlukan untuk contoh ini.


Dari contoh diatas, yang penting untuk dipahami adalah bahwa setiap Windows API memerlukan tipe data dan struktur data yang tepat. Tipe dan struktur data yang tidak ada persamaannya pada visual basic .NET pada umumnya dapat diwakili oleh struktur data IntPtr. Untuk mendapatkan tipe dan struktur data yang tepat, haruslah merujuk pada dokumentasi Windows API yang bersangkutan.

Demikian, semoga bermanfaat.

1 komentar:

Unknown mengatakan...

Mantap pa, ohya bila melihat proses berjalan dengan fungsi api windows dan di debug.print scripnya biar terlihat atau protokolnya agar bisa kita buat split seperti protocol yahoo messenger dengan menggunakan soket di vb.net.. Terimakasih..

Posting Komentar