 |
|
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+Tab và
Ctrl+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! |
|
|
|
 |
|
 |