1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Hướng dẫn viết một chương trình chạy nền t pdf

7 499 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Hướng dẫn viết một chương trình chạy nền
Thể loại Hướng dẫn
Định dạng
Số trang 7
Dung lượng 161,68 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Đáp: Để ứng dụng có thể nhận và xử lý sự kiện I/O ở mọi tình huống ngay cả khi ứng dụng khác đang chạy, bạn phải dùng kỹ thuật câu móc Hooks hàm xử lý sự kiện tương ứng vào Windows, hàm

Trang 1

Hướng dẫn viết một chương trình chạy nền

Hỏi: Xin hướng dẫn viết một chương trình chạy nền, khi nhấn tổ hợp phím thì chạy một đoạn code và nhấn tổ hợp phím khác thì dừng lại Khi đang chạy một chương trình khác thì làm sao chương trình của tôi nhận được sự kiện nhấn tổ hợp phím?

Đáp:

Để ứng dụng có thể nhận và xử lý sự kiện I/O ở mọi tình huống (ngay cả khi ứng dụng khác đang chạy), bạn phải dùng kỹ thuật câu móc (Hooks) hàm xử lý sự kiện tương ứng vào

Windows, hàm được câu móc cấp toàn hệ thống phải được đặt trong thư viện liên kết động *.dll Như vậy ứng dụng xử lý phím nóng (hot-key) của bạn gồm 2 module:

• file thư viện *.dll chứa hàm xử lý phím nóng và các hàm câu móc/gỡ ra

• file ứng dụng chứa các hàm chức năng mà sẽ được chạy/dừng khi tổ hợp phím tương ứng được

ấn

Sau đây là qui trình cụ thể để xây dựng 2 module bằng ngôn ngữ VC++ của Microsoft

Để xây dựng thư viện KeyHook.dll chứa hàm chặn tổ hợp phím nóng mong muốn, bạn hãy tiến hành các bước sau đây:

1 Chạy ứng dụng VC++ (phải cài đặt trước), chọn menu File.New.Projects, chọn loại Win32 Dynamic-link Library, chọn vị trí Location, nhập tên Project là KeyHook, ấn button Ok

2 Chọn checkbox A simple DLL project rồi chọn button Finish để tạo Project thực sự

3 Chọn menu File.New.Files, chọn loại C/C++ Header File, nhập tên KeyHook.h vào mục File name, ấn button Ok rồi viết đặc tả 2 hàm câu/gỡ hook như sau vào file KeyHook.h:

#include "stdafx.h"

//hàm câu móc hàm xử lý phím vào Windows

int FAR InstallHookKeyboard(HWND hWnd);

//hàm gỡ hàm xử lý phím ra khỏi Windows

int FAR UninstallHookKeyboard(void);

4 Chọn menu File.New.Files, chọn loại Text File, nhập tên KeyHook.def vào mục File name, ấn button Ok rồi viết đặc tả thư viện *.dll như sau vào file KeyHook.def:

LIBRARY KeyHook

EXETYPE WINDOWS

CODE PRELOAD MOVABLE

DATA PRELOAD SINGLE

HEAPSIZE 8192

STACKSIZE 8192

EXPORTS

InstallHookKeyboard @2

Trang 2

UninstallHookKeyboard @3

5 Chọn tab FileView ở dưới cửa sổ cây Project (thường nằm bên trái màn hình VC++), mở rộng nội dung của nhánh Source Files, nhấn đúp chuột vào file KeyHook.cpp để hiển thị nội dung của

nó rồi hiệu chỉnh thành nội dung như sau:

// -

// Nội dung file KeyHook.cpp

// -

#include "stdafx.h"

#include "KeyHook.h"

//định nghĩa các message cần dùng

#define WM_MYSTART (WM_USER+1)

#define WM_MYEND (WM_USER+2)

//định nghĩa các biến cần dùng

HWND hMyWnd;

int fHookKeyboard;

HANDLE hHookKeyboard;

HINSTANCE hModuleDll;

// -

//Hàm khởi động của thư viện,

//hàm này được kích hoạt tự động mỗi khi

//thư viện được link với ứng dụng

// -

BOOL APIENTRY DllMain(HINSTANCE hModule, ULONG ulReason, PCONTEXT pctx) { switch (ulReason) {

case DLL_PROCESS_ATTACH:

if (hModuleDll==0) hModuleDll= hModule;

break;

case DLL_PROCESS_DETACH:

UninstallHookKeyboard();

break;

} return TRUE;

}

// -

// Hàm xử lý sự kiện phím

// -

LRESULT FAR PASCAL CALLBACK KeyboardProc (int nCode, WPARAM wParam,

LPARAM lParam) {

short FAlt,FControl, FShift;

if (nCode >= 0 && nCode != HC_NOREMOVE && lParam >0) {

//xác định trạng thái các phím điều khiển

FShift = GetKeyState(VK_SHIFT);

FAlt = GetKeyState(VK_MENU);

FControl = GetKeyState(VK_CONTROL);

//kiểm tra tổ hợp phím Ctrl-S

Trang 3

if (FControl < 0 && wParam == 'S') {

//gởi thông báo WM_MYSTART về ứng dụng xử lý

SendMessage(hMyWnd, WM_MYSTART,wParam, (LPARAM)lParam);

return CallNextHookEx((struct HHOOK *)hHookKeyboard, nCode, wParam, lParam); }

if (FControl < 0 && wParam == 'E') {

//gởi thông báo WM_MYEND về ứng dụng xử lý

SendMessage(hMyWnd, WM_MYEND,wParam, (LPARAM)lParam);

return CallNextHookEx((struct HHOOK *)hHookKeyboard, nCode, wParam, lParam); }

}

return CallNextHookEx((struct HHOOK *)hHookKeyboard, nCode, wParam, lParam); }

// -

// Hàm câu móc hàm xử lý keyboard vào Windows

// -

int FAR InstallHookKeyboard(HWND hWnd) {

if (fHookKeyboard) return 1;

hHookKeyboard = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc, hModuleDll, 0);

if (hHookKeyboard == NULL) {

MessageBox(NULL,"Can't set Hook KeyboardProc","Error",MB_OK);

return 0;

}

hMyWnd = hWnd;

fHookKeyboard = 1;

return 1;

}

// -

// Hàm gỡ hàm xử lý keyboard

// -

int FAR UninstallHookKeyboard(void) {

if (fHookKeyboard==0) return 0;

fHookKeyboard = 0;

return UnhookWindowsHookEx((struct HHOOK *)hHookKeyboard);

}

6 Chọn menu Build Set Active Configuration, chọn mục Win32 Release, ấn button Ok

7 Chọn menu Build.Rebuild All để dịch Project thành file thư viện Nếu bạn nhập đúng các nội dung trên thì quá trình dịch sẽ không có lỗi, trong Project sẽ có thư mục Release, trong thư mục này sẽ có nhiều file được tạo ra, trong đó bạn hãy quan sát 2 file tên là KeyHook.dll và

KeyHook.lib, bạn sẽ copy 2 file này vào thư mục ứng dụng sẽ được viết trong giai đoạn 2 sau đây

Để xây dựng ứng dụng KeyHookDemo xử lý chức năng theo tổ hợp phím nóng, bạn hãy tiến

Trang 4

hành các bước sau đây:

1 Chạy ứng dụng VC++, chọn menu File.New.Projects, chọn loại Win32 Application, chọn vị trí Location, nhập tên Project là KeyHookDemo, ấn button Ok

2 Chọn checkbox A simple application rồi chọn button Finish để tạo Project thực sự

3 Copy 2 file đặc tả thư viện KeyHook.dll và KeyHook.lib vào thư mục ứng dụng (do Project hiện hành quản lý)

4 Chọn menu File.New.Files, chọn loại C/C++ Source File, nhập tên KeyHookDemo.cpp vào mục File name, ấn button Ok rồi viết đoạn code xử lý sau vào file KeyHookDemo.cpp:

#include <windows.h>

//khai báo các hàm trong thư viện KeyHook.dll

int FAR InstallHookKeyboard(HWND hWnd);

int FAR UninstallHookKeyboard(void);

//khai báo các thông báo cần xử lý

#define WM_MYSTART (WM_USER+1)

#define WM_MYEND (WM_USER+2)

// -

//Hàm xử lý cửa sổ của ứng dụng

// -

long FAR PASCAL MainWndProc(HWND hWnd, UINT message, WPARAM wParam,

LPARAM lParam) {

switch (message) {

case WM_CREATE:

//xảy ra 1 lần khi cửa sổ được tạo ra, câu móc hàm hook keyboard

if (InstallHookKeyboard(hWnd)==0)

MessageBox(NULL,"Khong cau moc ham xu ly keyboard duoc!!","Error",MB_OK); break;

case WM_MYSTART:

//viết đoạn code thực hiện chức năng của bạn vào đây

SetWindowText(hWnd,"Bat dau thuc hien chuc nang cua ban");

break;

case WM_MYEND:

//viet doan code dieu khien dung chuc nang cua ban vao day

SetWindowText(hWnd,"Ket thuc thuc hien chuc nang cua ban");

break;

case WM_ENDSESSION:

case WM_CLOSE:

case WM_DESTROY:

//xảy ra khi ứng dụng dừng

//gở bỏ hàm hook

UninstallHookKeyboard();

PostQuitMessage(0);

Trang 5

break;

default:

return (DefWindowProc(hWnd, message, wParam, lParam));

} // Switch message/

return ((long)NULL);

}

// -

//Hàm khởi động ứng dụng

// -

int InitApplication(HINSTANCE hInstance)

{

WNDCLASS wc;

wc.style = NULL; // Class style(s)

wc.lpfnWndProc = MainWndProc;

// Function to retrieve messages

//for windows of this class

wc.cbClsExtra = 0;

// No per-class extra data

wc.cbWndExtra = 0;

// No per-window extra data

wc.hInstance = hInstance;

// Application that owns the class

wc.hIcon = LoadIcon(hInstance, "ICON_1");

wc.hCursor = LoadCursor((HINSTANCE)NULL, IDC_ARROW);

wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

wc.lpszMenuName = "KeyHookDemo";

// Name of menu resource in RC file

wc.lpszClassName = "KeyHookDemo";

// Name used in call to CreateWindow

// Register the window class

//and return success/failure code

return (RegisterClass(&wc));

}

// -

//Hàm khởi động ứng dụng

// -

int InitInstance(HINSTANCE hInstance, short nCmdShow) {

HWND hWnd;

nCmdShow = SW_MINIMIZE;

hWnd = CreateWindow(

"KeyHookDemo",

// See RegisterClass() call

"KeyHookDemo",

// Text for window title bar

WS_OVERLAPPED|WS_SYSMENU|WS_MINIMIZEBOX, // Window style 50,30,400,150,

Trang 6

(HWND)NULL,

// Overlapped windows have no parent

(HMENU)NULL,

// Use the window class menu

hInstance,

// This instance owns this window

NULL);

// Pointer not needed

// If window could not be created, return "failure"

if (!hWnd) return (FALSE);

// Make the window visible; update its //client area; and return "success"

ShowWindow(hWnd, nCmdShow);

// Show the window

return (TRUE);

// Returns the value from PostQuitMessage

}

// -

//Điểm nhập của ứng dụng

// -

int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR

lpCmdLine, int nCmdShow) {

MSG msg; // message

if (hPrevInstance)

// Other instances of app running?

return (FALSE);

if (!InitApplication(hInstance))

// Initialize shared things

return (FALSE);

// Exits if unable to initialize

if (!InitInstance(hInstance, nCmdShow))

return (FALSE);

//lặp chờ nhận và xử lý thông báo từ Windows

while (GetMessage(&msg,(HWND)NULL,(UINT)NULL,(UINT)NULL)) {

TranslateMessage(&msg);

// Translates virtual key codes

DispatchMessage(&msg);

// Dispatches message to window

}

return (msg.wParam);

// Returns the value from PostQuitMessage

}

5 Chọn menu Project.Settings, chọn tab Link, nhập thêm tên thư viện KeyHook.lib vào mục Object/Library module (lưu ý không xóa bất kỳ thư viện nào đã có trong mục này) rồi ấn button

Ok

6 Chọn menu Build.Rebuild All để dịch Project thành file khả thi Nếu bạn nhập đúng các nội

Trang 7

dung trên thì quá trình dịch sẽ không có lỗi

7 Chọn menu Build.Execute KeyHookDemo để chạy thử ứng dụng, mỗi lần bạn ấn tổ hợp hot-key Ctrl-S và Ctrl-E, hàm hook sẽ phát hiện được và gửi thông báo tương ứng về ứng dụng Đoạn code xử lý thông báo của ứng dụng sẽ xử lý các thông báo gửi về theo đúng yêu cầu của bạn

Lưu ý đoạn code của ứng dụng trên đây chỉ là khung sườn, bạn cần hiệu chỉnh lại đoạn code xử

lý 2 thông báo WM_MYSTART và WM_MYEND theo yêu cầu riêng của mình

Bạn có thể liên hệ với tòa soạn TGVT để copy 2 project trên để tham khảo

 

Ngày đăng: 13/12/2013, 01:16

TỪ KHÓA LIÊN QUAN

w