(Trần Ngọc Tiến) Để giải quyết vấn đề trên, nhiều người (trong đó có cả tôi) từng nghĩ rằng có thể sử dụng hook để chặn và hủy các tín hiệu trong luồng thông điệp của hệ thống. 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, vì 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.
Đối với Windows 9x, có một cách đơn giản để làm điều này, dựa trên ghi nhận: các tổ hợp này hoàn toàn vô tác dụng khi Windows chạy các screen saver. Ta sẽ qua mặt Windows. Chúng ta sẽ sử dụng hàm SystemParametersInfo để làm việc này, ở đây tôi sử dụng Visual C++ và gọi hàm này ở hàm dựng và hàm hủy của lớp CMainFrame (không bắt buộc gọi tại đây).
Mã lệnh |
CMainFrame:: CMainFrame ()
{ // Vo hieu hoa Alt+Tab, Ctrl+Alt+Del, Ctrl+Esc :: SystemParametersInfo (SPI_SCREENSAVERRUNNING, true, NULL, NULL); // ... } CMainFrame:: ~CMainFrame () { // Phuc hoi // Trong VB, thay SPI_SCREENSAVERRUNNING bang 97 :: SystemParametersInfo (SPI_SCREENSAVERRUNNING, false, NULL, NULL); } |
Thực chất là ta chỉ đặt một cờ hiệu báo cho Windows biết có một screen saver đang chạy, chứ không phải chương trình của ta là một screen saver.
Đối với hệ điều hành khó tính Windows NT, ta dùng phương pháp chính quy hơn bằng cách sử dụng các hàm RegisterHotKey/UnregisterHotKey như sau:
Mã lệnh |
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); } |
Chúc các bạn thành công