• Thứ Ba, 15/05/2007 09:29 (GMT+7)

    Chương trình C# hiển thị ở traybar

    Câu hỏi :
    Tôi muốn viết một chương trình bằng C# chạy mặc định khi Windows khởi động và thu nhỏ xuống System tray ở chế độ chờ, nếu người dùng nhấn phím 1 sẽ hiện ra công việc số 1 cần giải quyết trong ngày. Tôi đã đặt thuộc tính this.keypreview = true và trong sự kiện key down dùng dòng lệnh sau:

     if (e.keycode==keys.Numpad1) //Đọc công việc số 1 phải giải quyết trong ngày
     if (e.keycode==keys.Numpad2) //Đọc công việc số 2 phải giải quyết trong ngày
     ....
     Tuy nhiên tôi gặp các trục trặc sau:
     - Không thể đăng ký để chương trình chạy cùng Windows khi khởi động.
     - Khi nhấn phím số 1, số 2... thì không thấy xảy ra sự kiện gì cả. Nó chỉ thực hiện khi form (chương trình) được bật lên.
     Xin hướng dẫn cách khắc phục. 
     

    Trả lời :

    Để đăng ký hay xóa đăng ký icon của ứng dụng vào mục "System tray" của Windows, bạn có thể gọi hàm API Windows có tên là Shell_NotifyIcon(). Chi tiết về các tham số của hàm này cùng đoạn code demo việc sử dụng nó được trình bày trong CD MSDN.

     Về xử lý sự kiện, mặc dù Windows cho phép chạy nhiều ứng dụng đồng thời nhưng tại mỗi thời điểm chỉ có 1 cửa sổ ứng dụng nào đó được ở chế độ "focus", duy nhất cửa sổ "focus" mới có quyền nhận và xử lý các sự kiện I/O. Như vậy nếu 1 ứng dụng chuyển về chế độ thu nhỏ thành icon ở system tray, nó không thể nhận và xử lý sự kiện được. Chính lý do này khiến đoạn code xử lý sự kiện trong ứng dụng của bạn không được kích hoạt khi ở chế độ icon thu nhỏ. Để luôn chặn và xử lý các sự kiện phím (hay chuột) ở bất kỳ chế độ làm việc nào, ứng dụng phải khai báo hàm hook vào Windows. Chi tiết về việc đăng ký hàm hook được trình bày trong bài "Win32 Hooks" trong CD MSDN.
     

    Chuyên mục: Lập trình