• Thứ Bảy, 27/12/2003 11:37 (GMT+7)

    Câu hỏi :
    Xin hỏi làm cách nào để lấy handle của ứng dụng khác như Word hay NotePad chẳng hạn.

    Trả lời :

    Sau khi cài đặt 1 phần mềm lên đĩa cứng, phần mềm gồm từ 1 đến nhiều file cấu thành, nếu có nhiều file thì có 1 file *.exe để khởi động phần mềm đó. Lúc phần mềm chưa chạy ta nhận dạng phần mềm bằng đường dẫn xác định file *.exe của phần mềm đó. Trong hệ điều hành đa nhiệm (multi-task) như Win9x thì bạn có thể chạy nhiều phần mềm đồng thời, mỗi file phần mềm cũng có thể được chạy nhiều lần khác nhau và cùng tồn tại đồng thời, hệ thống sẽ tạo ra 1 “instance” riêng cho mỗi lần chạy phần mềm, trong trường hợp này đường dẫn file phần mềm không đủ để phân biệt từng “instance” của phần mềm đó. Để khắc phục vấn đề này, hệ thống dùng khái niệm “process” để quản lý 1 “instance” cụ thể của 1 phần mềm, để phân biệt process, hệ thống dùng tên nhị phân cho từng process, mỗi tên nhị phân chỉ xác định duy nhất 1 process. Thực tế Windows dùng 2 loại tên nhị phân khác nhau cho từng process: handle và processID, có nhiều hàm API xử lý process khác nhau trong đó có hàm thì dùng handle để nhận dạng process, có hàm thì dùng processID để nhận dạng process. Hiện Microsoft không cung cấp hàm API nào cho phép liệt kê trực tiếp các process đang chạy, do đó để liệt kê các process đang chạy, bạn cần nghiên cứu để nắm vững cơ chế quản lý process của Windows, từ đó mới viết được module phần mềm liệt kê các process đang chạy. Thông tin về cơ chế quản lý process của Windows được trình bày chi tiết trong sách “Advanced Windows” của tác giả Jeffrey Richter.

    Mỗi phần mềm dùng giao diện đồ họa trong Windows gồm từ 1 đến n cửa sổ giao diện (window) khác nhau, chúng có mối quan hệ cha con theo hệ thống phân cấp. Windows cung cấp nhiều hàm API để bạn có thể duyệt các cửa sổ đang tồn tại trên Windows, mỗi cửa sổ thuộc về ứng dụng nào. Bạn hãy dùng MSDN (đĩa CD hay mạng MSN) đọc đặc tả chi tiết về các hàm API sau :

    FindWindowEx(), EnumWindows(), EnumDesktopWindows(), GetWindowThreadProcessId(),...

    Lưu ý bạn có thể dùng hàm GetWindow-ThreadProcessId() để tìm được thông tin về thread và process tạo ra cửa sổ cụ thể.
    Chuyên mục: Mạng - truyền thông