Senin, 06 Mei 2013

Menjalankan Program Secara Diam-Diam (Background Process)

Pernahkan Anda ingin menjalankan suatu program secara diam-diam (background process)? 

 Background process tidak akan muncul di taskbar, sehingga cukup aman untuk dijalankan tanpa diketahui orang lain. Program sejenis ini dapat digunakan jika Anda tidak ingin orang lain secara tidak sengaja (maupun dengan sengaja) menutup aplikasi anda. Atau Anda ingin mengeluarkan gambar seram secara tiba-tiba untuk menakuti teman Anda? Atau Anda ingin merekam semua keypress yang dilakukan oleh orang yang Anda benci, misalnya untuk mengambil password :D?


DISCLAIMER: Tutorial ini tidak ditujukan untuk tindakan kejahatan apapun. Segala macam tindak kriminal yang dilakukan menggunakan tutorial ini merupakan sepenuhnya di luar tanggung jawab kami!

Oke, sekian basa-basinya. Berikut ini akan dijelaskan langkah-langkah untuk membuat sebuah program berjalan secara background process, menggunakan C++. Tutorial ini dilakukan pada OS Windows 7. Apabila ada masalah dengan OS lain, silakan tulis komentar Anda di bawah.

1. Pertama, Anda perlu mengetahui function CreateProcess(). Fungsi ini berguna untuk menjalankan proses lain. Parameternya ada banyak, tetapi biasanya cukup 2 saja yang Anda perlu ketahui.

Parameter pertama merupakan filepath menuju executable yang Anda inginkan, sedangkan parameter kedua merupakan command-line parameter yang dapat Anda eksekusi melalui command prompt. Parameter kedua akan digunakan apabila parameter pertama bernilai NULL. Untuk referensi lebih lanjut, silakan kunjungi http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx

Maka, untuk menjalankan calculator, Anda dapat melakukan seperti ini
CreateProcess("C:\\Windows\\System32\\calc.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );
Perhatikan untuk parameter pertama, backslash harus ditulis ganda, karena dalam C++, backslash digunakan untuk meng-escape karakter

2. Parameter StartupInfo dan ProcessInformation pada function CreateProcess() tidak boleh diisi NULL, tetapi harus diisi sesuai dengan tipe datanya. Maka Anda perlu menambahkan baris ini sebelum mengeksekusi CreateProcess().
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  ZeroMemory( &si, sizeof(si) );
  si.cb = sizeof(si);
  ZeroMemory( &pi, sizeof(pi) );

3. Untuk menyembunyikan jendela executable, cukup tambahkan 3 baris berikut.
  HWND hwnd;
  hwnd = FindWindowA("ConsoleWindowClass", SW_HIDE);
  ShowWindow(hwnd, 0);

4. Sekarang, saatnya menggabungkan poin-poin penting yang telah dijelaskan. Misalnya kita akan membuat sebuah aplikasi yang dapat menampilkan gambar setiap satu jam (pukul 6, 7, 8, …). Untuk itu kita perlu membuat sebuah function untuk menangani waktu ini. Berikut adalah contoh function yang dimaksud.
void Tunggu(){
  time_t now;
  while(true){
    time(&now); //ambil waktu sekarang
    if(now % 3600 <=1){ // setiap 1 jam
      KeluarGambar();
      _sleep(3000); // pastikan hanya 1 gambar di detik yg sama
    }
    _sleep(1000); // jangan makan CPU terlalu banyak
  }
}

Function KeluarGambar() bertugas membuat proses baru yang mengeluarkan gambar. Untuk itu, kita perlu memanggil aplikasi yang dapat menampilkan gambar. Untuk tutorial ini, kita akan menggunakan Windows Photo Viewer. Windows tidak memberikan file executable untuk windows photo viewer, melainkan hanya sebuah file .dll yang diberikan pada directory C:\Program Files\Windows Photo Viewer. Untuk itu kita perlu mengeksekusi rundll32.exe terlebih dahulu. Berikut merupakan function yang dimaksud.
void KeluarGambar(){
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  ZeroMemory( &si, sizeof(si) );
  si.cb = sizeof(si);
  ZeroMemory( &pi, sizeof(pi) );
 
  char cmd[260] = "rundll32.exe \"C:\\Program Files\\Windows Photo Viewer\\PhotoViewer.dll\", ImageView_Fullscreen ";
  strcat(cmd, FILEPATH);
  CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );
}

Untuk FILEPATH dapat diisi sesuai lokasi file gambar. Lebih baik jika FILEPATH dideklarasikan di awal menggunakan preprocessor, sehingga mudah diganti. Misalnya seperti berikut:
#define FILEPATH "C:\\Program Files\\test.png"
Perhatikan bahwa lokasi file disesuaikan menurut komputer Anda! Penggunaan backslash ganda wajib karena backslash merupakan escape character dalam C++.

Terakhir adalah function main() sebagai entry program.
int main(){
  Sembunyi();
  Tunggu();
}

Library yang perlu di-include dalam pekerjaan ini adalah <windows.h>, <string.h>, dan <time.h>.

Compile hasil pekerjaan Anda. Karena ini merupakan background process, perhatikan bahwa untuk mengakhiri process tidak dapat di-close seperti biasa. Salah satu cara mengakhiri process adalah menggunakan task manager.

Source code dapat didownload di sini.  
Note: source code mengeluarkan gambar setiap 1 menit untuk mempermudah pengecekan. Silakan ubah konstanta waktu dari 60 menjadi 3600, seperti yang telah dibahas di tutorial.
*Apabila gambar tidak keluar, pastikan Anda telah meletakkan file sesuai path!

Ada pertanyaan / komentar / saran? Silakan masukkan di kotak di bawah ini… :D

Perhatian: Serabutan Dotcom menerima jasa programming, dan masih banyak lainnya lho! Murah, cepat, dan gampang, silakan kunjungi laman ini untuk melihat semua jasa yang kami tawarkan. Terima kasih ..!

1 komentar: