Ứng Dụng Cơ Chế Hook Để Xây Dựng Chương Trình Hỗ Trợ Gõ Tiếng Việt Trên Hệ Điều Hành Window 32 Bit

THThiNganHang
다운로드 0회
10
0

자료 내용

1쪽

[Programming] Ứng dụng cơ chế Hook - Phần 1 Ứng dụng cơ chế Hook để xây dựng chương trình hỗ trợ gõ Tiếng Việt trên Hệ Điều Hành Windows 32 Bit - Phần 1 , 6õ N L Ë Q Y jÿ LË SW K { Q JW U r Q+ : L Q G R Z V+ , * Lß L W K L ËX Ngày nay, : L Q G R Z Vcó lẽ không còn xa lạ với người sử dụng PC. Nhắc đến : L Q G R Z V, người ta thường nghĩ về nó như một Hệ Điều Hành (HĐH) dễ sử dụng, ở đó, tương tác giữa người dùng với các ứng dụng cũng như với các thành phần tiện ích của Windows thông qua giao diện đồ họa (GUI), bằng các thao tác trên keyboard, mouse vô cùng đơn giản. Một câu hỏi được đặt ra là : “Các ứng dụng làm thế nào để phân loại, lưu giữ cũng như đáp lại những tương tác đó cho người dùng ?”. Đối với : L Q G R Z Vvấn đề này được giải quyết một cách trọn vẹn : HĐH đưa ra cơ chế W K { Q JË S( P H V V D J Hÿ L ) cùng với tập hợp các cấu trúc dữ liệu và các hàm API hỗ trợ ứng dụng trong việc giao tiếp với người dùng. , + D L¥ LO RK j Q Jÿç L W K { Q Jÿ LË SU r QW : L Q G R ZV 7 U mß F K Ã W W D F « Q S K § L +E L Ã W: L Q G R Z VO j P W K ÃóO m XF i F Q j RW UW K { Q Jÿ LË S+ + D L¥ LO RK j Q Jÿç L W U R Q J : L Q G R Z V S K é Fÿ t F KQ j \Y é F K R P é F + Hàng đợi hệ thống (The System Queue) + Hàng đợi thông điệp của ứng dụng (Application Queue) Hàng đợi hệ thống (The System Queue) : L Q G R Z Vcó các trình điều khiển thiết bị (Drivers) chịu trách nhiệm cho các dịch vụ ngắt từ thiết bị phần cứng mouse và keyboard. Tại mỗi thời điểm ngắt phát sinh, các Driver này gọi một điểm vào (hàm) đặc biệt trong 8 6 ( 5 ( ; (để chỉ ra rằng một sự kiện vừa xảy ra. Tất cả các sự kiện mouse, keyboard được lưu trong một hàng đợi được gọi là hàng đợi hệ thống (The System Queue). Đây là hàng đợi dùng chung cho toàn hệ thống , mọi tiến trình đang chạy đều chia xẻ hàng đợi này. Nhiệm vụ độc nhất của nó là ghi nhận lại những sự kiện phần cứng (mouse actions, keystrokes) khi chúng xảy ra.

2쪽

+ j Q J ç Lÿ W K { Q Jÿ LË S F ë D í Q J G é Q J $ S S O L F D W L R Q 4 X H X H Khi một tiến trình được khởi tạo, một hàng đợi đại diện cho nó được tạo ra, hàng đợi này (đôi khi được gọi là hàng đợi tác vụ) được dùng để chứa những thông điệp sẽ được gởi cho các cửa sổ của ứng dụng. Những thông điệp này là những thông điệp được gởi một cách tường minh bằng một trong hai hàm sau : + 3 R V W 0 H V V D J H + 3 R V W $ S S 0 H V V D J H (Lưu ý : Hàm 3 R V W 4 X L W 0 H V V D J Hkhông gởi thông điệp vào hàng đợi ứng dụng Ứng dụng có thể dùng hai Primitive là * H W 0 H V V D J Hvà 3 H H N 0 H V V D J HdoWindows cung cấp để khảo sát hàng đợi của mình. Hai hàm này cho phép ứng dụng “Lấy một message ra khỏi hàng đợi” để từ đó phân loại và có những “Trả lời” thích hợp với người dùng. I.3.Bàn thêm về GetMessage và PeekMessage Bên trong HĐH : L Q G R Z V, * H W 0 H V V D J Hvà 3 H H N 0 H V V D J Hthi hành cùng mã lệnh. Điểm khác biệt chính giữa 2 hàm là trong trường hợp không có message nào được trả về cho ứng dụng. Trong trường hợp này, * H W 0 H V V D J Hđặt ứng dụng vào trạng thái “Sleep” trong khi 3 H H N 0 H V V D J Htrả về ứng dụng giá trị NULL. Ngay trước khi * H W 0 H V V D J Hvà 3 H H N 0 H V V D J Htrả message về cho ứng dụng, hệ thống sẽ kiểm tra xem có sự tồn tại của hook WH_GETMESSAGE hay không. Nếu có một “Filter Function” (thực chất là 1 hàm) ứng với hook trên được cài đặt, hàm này sẽ được gọi. “Filter Function” không được gọi nếu 3 H H N 0 H V V D J Hkhông tìm thấy message và trả về NULL. PeekMessage với tùy chọn PM_NOREMOVE Theo mặc định, cả 3 H H N 0 H V V D J Hvà * H W 0 H V V D J Hsẽ lấy message ra khỏi hàng đợi khi mỗi message được trả về cho ứng dụng. Tuy nhiên, có đôi lúc, ứng dụng có thể chỉ muốn vào hàng đợi để kiểm tra sự tồn tại của một messsage mà không muốn gỡ bỏ nó. Để làm được điều này, chương trình của ta sẽ gọi 3 H H N 0 H V V D J Hvới tùy chọn 3 0 B 1 2 5 ( 0 2 9 (lúc này 3 H H N 0 H V V D J Hvẫn trả về message như thường lệ nhưng sẽ không lấy nó ra khỏi hàng đợi.(Chi tiết về GetMessage và PeekMessage có thể tham khảo tại Article “ * H W 0 H V V D J H D Q G 3 H H N 0 H V V D J H” trong thư viện , Q W H U Q D O V 0 6 ' 1)

3쪽

II.Sự kiện bàn phím II.1.Mô hình chung Mỗi phím trên bàn phím được hệ thống gắn với một giá trị duy nhất gọi là P m T X p W ( 6 F D Q ),& R G Hđây là một giá trị phụ thuộc thiết bị, tức là giá trị này sẽ lệ thuộc vào từng loại bàn phím cụ thể. Khi người dùng gõ một phím, sẽ có 2 mã quét được sinh ra : một khi phím được nhấn và một khi phím được thả. 7 U u Q Kÿ LÅ X N K L Ç Q E j Q( . H \ E R D U GS K t P ' H Y L F H) sẽ thông dịch mã quét và' U L Y H U chuyển nó thành P m S K t P§ R( Y L W X D ON H \ F R G H), một giá trị độc lập thiết bị, được định nghĩa bởi hệ thống. Sau đó, trình điều khiển tạo một thông điệp bao gồm scancode, virtual-key code cùng một số thông tin khác (sự lặp phím, trạng thái các phím Alt, Ctrl...) , đặt vào hàng đợi hệ thống. Hệ thống lấy thông điệp này ra khỏi hàng đợi hệ thống và gởi đến hàng đợi thông điệp của ứng dụng. Cuối cùng, Y z Q J» SO W K { Q JË S( 0 H V V D J Hÿ L ) sẽ lấy thông/ R R S điệp ra khỏi hàng đợi ứng dụng và chuyển nó đến hàm xử lý message thích hợp để xử lý. Quá trình trên có thể minh hoạ qua hình vẽ sau : Rõ ràng là nếu ta có một cách nào đó để có được message trước khi nó đến hàm xử lý thông điệp của cửa sổ, ta có thể thực hiện được một vài thao tác thú vị. Và trên HĐH : L Q G R Z V, điều này hoàn toàn có thể thực hiện được nhờ cơ chế hook như ta sẽ thấy ở phần sau. II.2.Các thông điệp liên quan bàn phím Khi ta nhấn một phím, một thông điệp WM_KEYDOWN sẽ được đặt vào hàng đợi của tiểu trình ứng với cửa sổ đang được focus. Và khi ta nhả phím, hàng đợi sẽ có một thông điệp WM_KEYUP. Hai thông điệp này thường xuất hiện thành cặp. Tuy nhiên, nếu ta nhấn phím và giữ phím đủ lâu làm đặc tính “ $ X W R P D W L F” của bàn phím5 H S H D W hoạt động, hệ thống sẽ sinh nhiều thông điệp WM_KEYDOWN liên tiếp nhau. Và lưu ý một điều là khi chúng ta nhả phím, chỉ có một thông điệp WM_KEYUP được phát sinh mà thôi. Z 3 D U D Pcủa cả 2 thông điệp trên sẽ cho ta mã phím ảo (virtual-key code) của phím được nhấn. O 3 D U D Pdùng 32 bit của mình để mô tả thông tin thêm về sự kiện gõ phím đã tạo ra message.

앞 3페이지만 표시됩니다. 전체를 보려면 자료를 다운로드하세요.

댓글 (0)

로그인 하여 토론에 참여하기

댓글이 없습니다. 첫 댓글을 남겨보세요!