Số 49
HỒ LÔ BIẾN

“Xì-tốp” hai tổ hợp phím Alt+Tab và Ctrl+Esc trong Windows

NGUYỄN ĐỨC HIẾU (Hoàn Kiếm, Hà Nội)

Có lẽ khi đọc cái tựa bài này, bạn sẽ cho rằng đó là yêu cầu “hổng giống ai” đối với hệ điều hành đa nhiệm như Windows. Nhưng trong thực tế, việc làm này đôi khi rất cần thiết cho các ứng dụng chạy trên các máy tính dùng để tìm kiếm và tra cứu thông tin ở thư viện, siêu thị, nhà triển lãm, tiệm CD... chạy mạng WFW hay NT. Trong những trường hợp này, ta muốn người dùng tập trung vào chương trình chạy sẵn, ngăn ngừa việc chuyển qua các chương trình khác hoặc thoát ra khỏi chương trình, tệ hơn là sửa đổi gì đó trên hệ thống của bạn (không hiếm khách hàng có thói quen... “táy máy” không đúng chỗ).

Để giải quyết vấn đề nêu trên, nhiều người (trong đó có cả tôi) đã từng nghĩ có thể sử dụng các móc gài (hook) để chặn và hủy các tín hiệu của việc nhấn hai tổ hợp phím Alt+TabCtrl+Esc trong luồng thông điệp của hệ thống. Phương pháp móc gài nghe qua tưởng chừng rất hiệu quả, song bạn chỉ có khả năng đọc thấy sự hiện diện của các tổ hợp đó sau khi Windows đã xử lý chúng mà thôi, bởi mức ưu tiên của chúng khác với các thông điệp WM-KEYBOARD bình thường. Tôi đã tốn công viết ra một DLL theo phương pháp này rồi mới thấy nó vô tác dụng.

Đối với Windows 9x, thực ra việc ngăn chặn này rất đơn giản, không cần kỹ thuật “cao siêu” gì cả. Nếu để ý, bạn sẽ thấy rằng khi Windows chạy screen saver, tổ hợp phím Alt+Tab và Ctrl+Esc hoàn toàn mất tác dụng. Vậy việc cần làm là “qua mặt” Windows, làm nó tưởng lầm có một screen saver đang chạy.

Cụ thể, tôi dùng một hàm “không ai ngờ tới” là System-ParametersInfo để làm việc này. Nếu lập trình bằng Visual C++, bạn gọi hàm này ở hàm dựng và hàm hủy của lớp CMain- Frame như đoạn mã 1.

Đoạn mã 1

CMainFrame::CMainFrame ( )

{

// Vô hiệu hóa Alt+Tab, Ctrl+Alt+Del,

Ctrl+Esc

::SystemParametersInfo

(SPI-SCREENSAVERRUNNING, true,

NULL, NULL);

//...

}

CMainFrame::~CMainFrame ( )

{

// Phục hồi tác dụng của Alt+Tab,

Ctrl+Alt+Del, Ctrl+Esc

// Trong Visual Basic, thay

SPI-SCREENSAVERRUNNING bằng 97

::SystemParametersInfo

(SPI-SCREENSAVERRUNNING, false,

NULL, NULL);

}

Về thực chất, ta chỉ đặt một cờ hiệu báo cho Windows biết có một chương trình screen saver đang chạy, chứ không phải chương trình của ta được coi là một screen saver (các screen saver không bao giờ phải gọi hàm SystemParametersInfo như vậy). Xin nói thêm rằng SystemParameters Info là một hàm rất thú vị đối với những người thích “đào bới” hệ thống, qua nó ta có thể truy xuất nhiều thông tin khác về bàn phím, chuột, nguồn điện, v.v...

Đối với hệ điều hành khó tính như Windows NT, bạn có thể sử dụng phương pháp “chính quy” hơn: gọi các hàm RegisterHotKey/UnregisterHotKey như ở đoạn mã 2.

Đoạn mã 2

int m-nHotKeyID;

...

CMainFrame::CMainFrame ( )

{

m-nHotKeyID = 1999;

BOOL m-isKeyRegistered =

RegisterHotKey

(GetSafeHwnd(), m-nHotKeyID,

MOD-ALT, VK-TAB);

ASSERT (m-isKeyRegistered != FALSE)

;

}

CMainFrame::~CMainFrame ( )

{

BOOL m-isKeyUnregistered =

UnregisterHotKey

(GetSafeHwnd(), m-nHotKeyID);

ASSERT (m-isKeyUnregistered !=

FALSE);

}

Lời bàn của SI SÁP

SI SÁP tôi nhận thấy việc dùng hàm SystemParametersInfo cho kết quả tốt đối với các tổ hợp phím Alt+Tab và Ctrl+Esc trong Windows 9x/ME. Giải pháp dùng cặp hàm RegisterHotKey/UnregisterHotKey trong môi trường Windows NT/2000/ XP chỉ có hiệu quả đối với tổ hợp phím Alt+Tab. Muốn chặn được tổ hợp phím Ctrl+Esc, ta phải viết thêm một dòng lệnh nữa như sau:

BOOL m-isKeyRegistered2 = RegisterHotKey ( GetSafeHwnd(), GlobalAddAtom(“Hotkey2”), MOD-CONTROL, VK-ESC);

Trong đó cần sử dụng hàm GlobalAddAtom() để nhận mã ID tự động của phím nóng (hot key) muốn xử lý.

Nhìn chung, giải pháp của bạn Đức Hiếu đơn giản mà lại rất hiệu quả trong việc ngăn chặn người sử dụng “táy máy” các tổ hợp phím Alt+Tab và Ctrl+Esc để chuyển qua các chương trình “không được phép quan tâm”. Tuy nhiên, để đạt được yêu cầu thực tế, có lẽ “chủ máy” cũng phải “giấu” cả con trỏ chuột vì người sử dụng vẫn có thể “táy máy” bằng con chuột!

[Đầu trang]
Trang chủ
Thư ngỏ
Nội lực "Peter Pan"
Cầu nối Intel Việt Nam
Chuyện trong tuần
Nhóm Frontpage
Cõi người ta
Kim cương doanh nghiệp
Bình luận thị trường
Cõi Mô-bai
Chuyên đề
Bổ ngửa
Nuôi hồn Robot
Túi càn khôn IT
Hồ lô biến
Cảm về Game
Nhật ký e-CHÍP
Bản quyền VASC Orient, Công ty phát triển phần mềm VASC
99 Triệu Việt Vương HN; Tel: (04) 9782235 • email: echip@vasc.com.vn