Chính vì vấn đề rất phụ thuộc vào cách mở PDF mà tôi đã khó tính. Với tôi không chỉ 1 câu cụt lủn "mở bằng đường dẫn", "đóng bằng đường dẫn" là được.
Nếu dùng cách mở như bạn thì system sẽ phải xác định, ứng dụng nào mặc định sẽ được dùng để mở tập tin PDF. Thông tin được ghi trong Registry. Với tập tin BMP, AVI, XLSX ... tương tự.
Nhìn hình 1 thấy (trên Windows 10 của tôi)
View attachment 235987
trong registry ở khóa HKEY_CLASSES_ROOT có khóa
.pdf. Nhìn sang phải thì giá trị mặc định là
AcroExch.Document.11. Cuộn xuống một tí, vẫn ở khóa HKEY_CLASSES_ROOT ch
View attachment 235988
Nhìn sang phải thấy giá trị mặc định là "
C:\Program Files ... \ AcroRd32.exe". Cần phải đọc ra ứng dụng mặc định dùng để mở PDF. Tức: truy cập tới khóa
HKEY_CLASSES_ROOT\.pdf rồi đọc giá trị của tên mặc định, giả sử là
XYZ. Truy cập tới khóa
HKEY_CLASSES_ROOT\XYZ\shell\Open\command rồi đọc ra giá trị của tên mặc định, rồi lọc ra đường dẫn tới tập tin EXE.
Một cách khác là: dùng Windows API hook
WH_CBT (SetWindowsHookEx). Trong hook procedure CBTProc khi code = HCBT_CREATEWND hoặc HCBT_ACTIVATE thì wParam là handle của cửa sổ được tạo. Cần ghi lại handle này để sau đó đóng nó bằng WM_CLOSE. Tóm lại là:
SetWindowsHookEx -> chạy code của bạn để mở PDF. Khi đó sẽ có cửa sổ ứng dụng NitroPDF hoặc Foxit hoặc ... được tạo, và trong CBTProc handle của cửa sổ đó được lưu lại. Vậy khi cần đóng cửa sổ thì gửi thông điệp WM_CLOSE tới cửa sổ đó thôi.
Code lấy giá trị từ Registry, code hook WH_CBT có thể tìm trên mạng, trên GPE. Bạn tự tìm hiểu.