Các chương trình quản lý phòng máy hiện nay ở Việt Nam - 5
lượt xem 7
download
Hai dòng đầu tạo một HDC cho thiết bị màn hình hiển thị, do tính chất đặc biệt của màn hình mà hàm chỉ cần nhận tham số tên “DISPLAY” là có thể trả về kết quả. Ba dòng kế tiếp có tác dụng lấy độ rộng và độ dài của màn hình. Dòng cuối là gọi phương thức SetWindowPos như cách 1. Có một lưu ý nhỏ ở đây là ta vẫn có thể sử dụng thay thế hàm SetWindowPos bằng một hàm API khác là MoveWindow. ...
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Các chương trình quản lý phòng máy hiện nay ở Việt Nam - 5
- hàm API CreateDC: tạo ngữ cảnh thiết bị hàm API GetDeviceCaps: lấy các thông số của thiết bị. Áp dụng mã vào chương trình như sau: HDC hScrDC; hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL); int xScrn, yScrn; xScrn = GetDeviceCaps(hScrDC, HORZRES); yScrn = GetDeviceCaps(hScrDC, VERTRES); //resize cho lon nhat . Day la topmost window SetWindowPos(&wndTopMost, 0, 0, xScrn, yScrn, SWP_SHOWWINDOW); Hai dòng đầu tạo một HDC cho thiết bị màn hình hiển thị, do tính chất đặc biệt của màn hình mà hàm chỉ cần nhận tham số tên “DISPLAY” là có thể trả về kết quả. Ba dòng kế tiếp có tác dụng lấy độ rộng và độ dài của màn hình. Dòng cuối là gọi phương thức SetWindowPos như cách 1. Có một lưu ý nhỏ ở đây là ta vẫn có thể sử dụng thay thế hàm SetWindowPos bằng một hàm API khác là MoveWindow. Để biết chi tiết hàm, xem thêm trong Phụ lục Các hàm API hữu ích sử dụng trong chương trình. Hàm API này tuy có chức năng tương tự với SetWindowPos nhưng hàm lại không có chức năng quản lý việc “nổi” lên trên cửa sổ khác.Mặc dù theo thiết kế ban đầu khi khởi động xong, chỉ có một cửa sổ màn hình che phủ toàn bộ màn hình, rất có khả năng người dùng nhanh tay kích hoạt một cửa sổ nào đó trên desktop. Khi ấy, sử dụng hàm MoveWindow lại không làm cửa sổ “nổi” lên trên tất cả các cửa sổ còn lại. Hàm SetWindowPos lại có thêm tác dụng hữu ích này. Thử nghiệm: Chương trình vô hiệu hóa tuyệt đối việc tương tác của người dùng với desktop bằng mouse. Chỉ còn lại một việc nữa phải làm là vô hiệu hóa bàn phím. 101
- Hình 3-6 Màn che mouse 3.2.2.2 Tương tác bằng bàn phím: Mục tiêu ban đầu là không cho người dùng gõ những phím tắt kích hoạt chương trình. Tuy nhiên, ta không cần vô hiệu hóa cả bàn phím. Điều này rất lãng phí công sức. Thực chất, ta thực hiện mục tiêu dưới điều kiện hoàn thành ngăn chặn tương tác với mouse. Vì vậy các loại tương tác làm cho xuất hiện các chương trình thông thường như Windows Explorer (Win key + E)… không làm ta quan tâm vì các cửa sổ chương trình đó không thể “nổi” bằng cửa sổ màn hình che. Vì vậy, chỉ còn lại các loại phím và tổ hợp phím tắt “nhạy cảm” cấp thấp mà thôi. Các loại phím tắt đó là: o Win key : có tác dụng bật Start menu. o Alt + Tab : có tác dụng đổi cửa sổ đang hoạt động. o Alt + Esc : có tác dụng kích hoạt cửa sổ kế trên thanh taskbar. 102
- o Ctrl + Esc: có tác dụng tương tự Win key o Ctrl + Shift + Esc : có tác dụng bật Task Manager. o Esc : đây là vấn đề về kỹ thuật làm, theo thiết kế ta tạo một cửa sổ hộp thoại đơn giản, nên chịu tác dụng của phím Esc, có tác dụng tắt cửa sổ màn che. o Alt + F4 : có tác dụng tắt cửa sổ màn hình che. o Ctrl + Alt + Del : có tác dụng bật Task Manager, hay hộp lựa chọn tùy theo cấu hình Windows (đây là tổ hợp phím gây “nhức đầu” nhiều nhất, ta sẽ đề cập kỹ trong phần sau). o Ctrl + Shift + Esc : bật Task Manager. May mắn thay, trong 7 tổ hợp phím đầu, ta dễ dàng loại bỏ khi sử dụng kỹ thuật lập trình bằng hook, xem chi tiết về kỹ thuật này trong 3.1 Kỹ thuật lập trình sự kiện và hook và mã nguồn chương trình. Ta chỉ áp dụng xây dựng một hook đơn giản lọc bỏ trong quá trình đợi đăng nhập và loại bỏ khi đăng nhập xong. Tuy nhiên, với 2 tổ hợp phím cuối cùng, Ctrl + Alt + Del và Ctrl + Shift + Esc (về sau ta gọi tắt chỉ một mình tổ hợp Ctrl + Alt + Del vì tổ hợp Ctrl + Shift + Esc cũng có tính năng tương tự), khá phức tạp. Ta phải hiểu rõ cơ chế truyền gởi thông điệp Ctrl – Alt – Del. Hook bàn phím không thể bắt được tổ hợp phím Ctrl – Alt – Del ! Tại sao ? Vì chính bản thân hệ điều hành Windows không hề gởi tổ hợp phím này cho hook chain. Nó đã được chặn bắt và xử lý ở mức thấp hơn ở hệ thống và không bao giờ được gởi lên ứng dụng. Ứng dụng nếu có cài đặt cũng chỉ nhận được các phím Ctrl, Alt, và Del rời rạc chứ không phải là tổ hợp Ctrl – Alt – Del. Tổ hợp phím sau đó sẽ gởi đến cơ chế khởi động đăng nhập của Windows, gọi là Winlogon, gồm 3 thành phần : thành phần thực thi (“winlogon.exe”), thư viện liên kết động “Chứng thực và nhận dạng theo cơ chế đồ họa” (Graphical Identification and Authentication GINA) (“msgina.dll”), và các thành phần mạng. Tham khảo các tài liệu, ta tìm thấy các cách khống chế tổ hợp Ctrl – Alt – Del, một số cách dựa trên việc khống chế một trong hai thành phần đầu trong cơ chế khởi động đăng nhập của Windows như sau: 103
- Giả lập “lừa” hệ điều hành rằng đang có một screensaver đang chạy, tổ hợp • phím được gởi nhưng không kích hoạt Task Manager. Tuy nhiên, cách này chỉ có tác dụng ở các phiên bản hệ điều hành Win98, không có tác dụng trên WinXP. Cách này cũng rất hạn chế khi chỉ có tác dụng khi có thiết lập hệ thống phù hợp, một số tài liệu cho rằng cả phiên bản hệ điều hành Win98 cũng không có tác dụng !. Vô hiệu hóa Task Manager bằng chính sách (policy). Cách này không hề xử • lý ở “gốc”, chặn bắt thông điệp Ctrl – Alt – Del, mà xử lý ở “ngọn”, đặt chính sách hệ thống ngăn chặn kích hoạt Task Manager. Cách này đơn giản nhưng không dùng được vì thông điệp thông báo : Hình 3-7 Thông báo của policy về việc vô hiệu hóa Task Manager khá bực mình, lại còn làm xuất hiện Start Menu. Bắt thông điệp ở tận “gốc” khi xây dựng driver thiết bị bàn phím. Lúc đó, • phải sử dụng Device Development Kit (bộ phát triển thiết bị). Đây là lĩnh vực lập trình hoàn toàn mới, với thời gian nghiên cứu không cho phép, ta bỏ qua khả năng này. Viết một GINA stub. GINA là một thư viện liên kết động mà Winlogon dùng • để chứng thực người dùng. Đây là một cách khá hay, nhưng nó lại làm thay đổi cách đăng nhập của người dùng đồng thời vô hiệu hóa màn hình Welcome, và chớp màn hình mỗi khi người dùng nhấn Ctrl – Alt – Del. Tuy ta không sử dụng cách này nhưng có thể xem thêm về kỹ thuật này trong Phụ lục GINA stub – kỹ thuật xây dựng. Tạo một desktop mới và chuyển sang desktop mới này. Vì kích hoạt Task • Manager bằng tổ hợp phím Ctrl – Alt – Del chỉ làm xuất hiện Task Manager 104
- trên “Default” desktop (desktop cũ), nên trên desktop mới sẽ không có xuất hiện. Cách này khá hiệu quả khi ta xây dựng màn hình che bên desktop mới, người dùng đăng nhập vào thì trở lại desktop cũ. Khuyết điểm nhỏ của cách này là hơi phức tạp về mặt lý thuyết cài đặt chương trình, và người dùng đăng nhập vào thành công sẽ thấy Task Manager hiện ra mặc dù trước đó có vẻ việc nhấn Ctrl – Alt – Del không có tác dụng. Tuy ta không sử dụng cách này nhưng có thể xem thêm về kỹ thuật này trong Phụ lục Tạo thêm và sử dụng Desktop mới. Kế thừa, trở thành lớp con của lớp cửa sổ SAS trong tiến trình Winlogon. Để • làm được điều này, mã phải được “chích” (inject) vào tiến trình Winlogon và sau đó tạo lớp con kế thừa Windows Procedure. Kỹ thuật này không tương thích với Windows 95/98/Me. Ta sẽ sử dụng kỹ thuật này để vô hiêu hóa tổ hợp phím Ctrl – Alt - Del. Module xây dựng gồm có hai phần lớn : tạo lớp con kế thừa lớp cửa sổ SAS của Winlogon. * Tạo lớp con kế thừa lớp cửa sổ SAS của Winlogon: Hàm API SetWindowLong sẽ giúp ta thực hiện điều này: Áp dụng hàm vào trong chương trình: SetWindowLong(hWnd, GWL_WNDPROC, NewWindowProc); Lời gọi chỉ có tác dụng cho các cửa sổ được tạo bởi cùng ứng dụng gọi hàm (địa chỉ hàm NewWindowProc chỉ có nghĩa với tiến trình gọi hàm SetWindowLong). Như vậy, ta sẽ dùng một cách nào đó ánh xạ được điạ chỉ của NewWindowProc vào trong không gian địa chỉ của tiến trình ở xa và chuyển địa chỉ đó đến lời gọi hàm SetWindowLong. Để có thể hiểu cơ chế nạp một chương trình vào bộ nhớ, cũng như định nghĩa về không gian địa chỉ của tiến trình, xem thêm Phụ lục Quá trình nạp một hook DLL toàn cục. Bây giờ, ta sẽ bàn về kỹ thuật injection. * Kỹ thuật injection: 105
- Khả năng ứng dụng của kỹ thuật injection rất mạnh mẽ và hữu ích. Ưu điểm này cũng lại là khuyết điểm. Vì càng có nhiều khả năng ứng dụng mà không bị hạn chế, kỹ thuật injection đòi hỏi các lập trình viên cần phải lập trình cực kỳ cẩn thận các đọan mã mà họ sẽ “chích” vào tiến trình ở xa. Mọi hành động “chích” lầm sẽ dẫn đến hậu quả cực kỳ nguy hiểm như crash chương trình ở xa, treo máy… Tuy nhiên, việc lập trình thành công bằng kỹ thuật injection sẽ gợi mở nhiều khả năng lập trình thú vị như : xem mật khẩu dạng * trên một cửa sổ khác, Hình 3-8 Ứng dụng xem mật khẩu từ cửa sổ khác điều khiển hoạt động của các tiến trình hệ thống Windows như : giấu tên tiến trình đang chạy trong hai tab Applications” và “Processes” của Task Manager, … đặc biệt là ứng dụng mà ta cần là vô hiệu hóa Ctrl – Alt – Del. Vậy thực chất kỹ thuật injection là gì ? Kỹ thuật ánh xạ bộ nhớ (mã chương trình) vào trong không gian địa chỉ của một tiến trình ở xa được gọi là kỹ thuật injection. Việc injection có thể thực hiện bởi một trong những cài đặt sau: Registry. Để “chích” một DLL vào một tiến trình, chỉ cần đơn giản thêm tên • DLL đó vào trong khóa registry: HKLM\Software\Microsoft\Windows NT\ 106
- CurrentVersion\Windows\AppInit_DLLs:STRING chỉ hỗ trợ trên Windows NT trở lên. Hook. Cách này hỗ trợ trên mọi phiên bản Windows. • Sử dụng CreateRemoteThread()/LoadLibrary(), chỉ đúng với • Windows NT và cao hơn. Sao chép mã trực tiếp vào tiến trình ở xa bằng WriteProcessMemory() • và thực thi nó bằng hàm CreateRemoteThread(), chỉ đúng với Windows NT và cao hơn. Mức độ cẩn thận trong lập trình tăng dần từ trên xuống trong 4 cài đặt của kỹ thuật, tỉ lệ nghịch với việc tiêu tốn tài nguyên (giảm dần từ trên xuống). Cơ chế hook vẫn áp dụng được trong kỹ thuật này nhưng việc áp dụng nó khá tiêu tốn tài nguyên hệ thống. Ta sẽ thực hiện phương án cuối để áp dụng kỹ thuật injection cho cài đặt trong phần mềm. Phương án 3 cũng khả thi nhưng lại không ổn định, tùy thiết lập của máy mà phương án thành công hay không, có thể xem thêm phương án này trong mã nguồn chương trình. Ở đây, ta sẽ mô tả cài đặt cuối : Chương trình sử dụng cài đặt cuối qua hai hàm InjectCode, và EjectCode. InjectCode thực hiện việc sao chép dữ liệu và trong tiến trình của cửa sổ SAS. Các dữ liệu này là : InjectFunc, “khung” thực thi của tiểu trình, GetSASWnd, tìm handle của cửa sổ SAS, SASWindowProc, hàm window procedure của lớp con kế thừa, INJDATA, các dữ liệu đầu vào. Hàm InjectCode int InjectCode () Bỏ qua các chi tiết rườm rà về kỹ thuật (cấp phát bộ nhớ bên tiến trình ở xa, kỹ thuật lấy vùng nhớ …) thì hàm InjectCode làm những động tác sau: o Lấy địa chỉ hàm FindWindowA trong DLL USER32.DLL. o Mở tiến trình winlogon.exe với truy cập toàn quyền. o Sao chép dữ liệu INJDATA với khởi tạo gồm tên lớp "SAS Window class", tên cửa sổ "SAS window", địa chỉ hàm FindWindowA vào tiến trình ở xa. 107
- o Sao chép hàm GetSASWnd vào trong tiến trình ở xa. o Tạo tiểu trình thực hiện việc tìm kiếm handle của cửa sổ SAS. o Nếu thành công, sẽ trả về handle cửa sổ SAS. o Sao chép nội dung hàm SASWndProc vào trong tiến trình ở xa. o Sao chép dữ liệu INJDATA với khởi tạo gồm địa chỉ hàm SetWindowLong (tùy theo tiến trình ở xa có sử dụng Unicode hay không mà sẽ chép tương ứng hàm dạng hay SetWindowLongW), SetWindowLongA CallWindowProc (tùy theo tiến trình ở xa có sử dụng Unicode hay không mà sẽ chép tương ứng hàm dạng hay CallWindowProcA CallWindowProcW), SASWndProc. o Trong SASWndProc, cần sử dụng dữ liệu trong INJDATA nhưng đây là một hàm callback nên tham số đầu vào không thể tùy biến, ta không thể truyền tường minh dữ liệu này. Vì vậy, ở đây, ta đã biết được địa chỉ của dữ liệu đầu vào INJDATA, và cả nội dung hàm SASWndProc đã được ghi vào vùng nhớ bên tiến trình ở xa, ta phải thực hiện động tác ghi trực tiếp giá trị biến nội tại sẽ lưu địa chỉ dữ liệu đầu vào INJDATA, bằng cách tìm trong vùng nhớ ở xa đã ghi nội dung hàm SASWndProc từng DWORD một. Dĩ nhiên biến nội tại này đã lưu một giá trị đặc biệt để có thể tìm ra. o Sao chép nội dung hàm InjectFunc o Tạ o tiểu trình thực hiện nội dung hàm InjectFunc: dùng SetWindowLong thay window procedure mới. o Nếu thành công, công việc hoàn tất. Hàm InjectFunc Chức năng: tạo lớp con kế thừa, thay đổi hàm window procedure mới cho cửa sổ SAS. static DWORD WINAPI InjectFunc (INJDATA *pData) Hàm window procedure mới chính là SASWindowProc. Ta không thể lấy dữ liệu từ tiến trình ở xa (ví dụ như truy cập hàm SetWindowLong…) nên mọi dữ liệu đầu vào phải chuẩn bị sẵn và “chích” vào tiến trình, tại đây, lần lượt các hàm sẽ 108
- sử dụng các dữ liệu này. Ở đây, InjectFunc sử dụng địa chỉ hàm SetWindowLong trong INJDATA Ý nghĩa tham số: pData: dữ liệu đầu vào, sẽ được giải thích ở phần sau. Hàm GetSASWnd Chức năng :lấy handle của cửa sổ SAS. static HWND WINAPI GetSASWnd (INJDATA *pData) Hàm SASWindowProc LRESULT CALLBACK SASWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) Nếu đến đây mọi việc “đột nhập” đều suôn sẻ, các công việc sau đây sẽ được thực hiện tiếp trong đoạn mã vừa sao chép (là nội dung các hàm nêu ở trên, các bước sau đều thực hiện trong không gian địa chỉ ảo của tiến trình ở xa): Lấy handle của cửa sổ SAS : • hSASWnd = FindWindow("SAS Window class", "SAS window"); FindWindow là một hàm API khá hữu ích, được dùng để tìm handle của các cửa sổ top-level nếu biết tên cửa sổ và tên lớp. Tạo lớp con kế thừa window procedure của cửa sổ SAS: • SetWindowLong(hSASWnd, GWL_WNDPROC, NewSASWindowProc); Trong NewSASWindowProc(), bắt thông điệp WM_HOTKEY và trả về 1 • cho tổ hợp phím Ctrl – Alt – Del. LRESULT CALLBACK NewSASWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_HOTKEY) { // Ctrl+Alt+Del if (lparam == MAKELONG(MOD_CONTROL | MOD_ALT, VK_DELETE)) return 1; 109
- } return CallWindowProc(OldSASWindowProc, hWnd, wParam, lParam); } Hình 3-9 Màn che mouse và bàn phím 110
- 3.3 Tương tác với hệ thống – Điều khiển danh sách các ứng dụng đang chạy: Trong quá trình thực hiện phần mềm, có một yêu cầu quản trị hệ thống là người quản trị muốn biết tại thời điểm hiện tại, người dùng đang mở những ứng dụng gì. Người quản trị có thể xem danh sách các ứng dụng đó, đồng thời có thể thay đổi bằng cách thêm (mở một ứng dụng mới), bớt (tắt một ứng dụng đang chạy). Yêu cầu này đòi hỏi cần phải tìm hiểu cơ chế quản lý cửa sổ trong hệ điều hành Windows. 3.3.1 Các hàm dạng Enum_ và cơ chế gọi ngược (callback) của Windows: Có một số dữ liệu về hệ thống mà chúng ta khi cần truy cập trực tiếp sẽ rất khó khăn, ví dụ như có bao nhiêu font chữ trên hệ thống ?, có bao nhiêu cửa sổ đang họat động trên hệ thống ?... vì các dữ liệu dạng này đều do hệ thống nắm giữ, và hệ thống không muốn chúng ta để ý nhiều về chi tiết quản lý của nó. Do đó, hệ điều hành Windows cung cấp một số các hàm liệt kê sẽ giải đáp những thắc mắc trên của chúng ta. Vấn đề còn lại là hệ thống không biết chúng ta sẽ xử lý như thế nào với những dữ liệu mà nó cung cấp vì dữ liệu dạng này không được tường minh (có thể không có hoặc có rất nhiều), hệ thống phải kiểm tra và trả về từng thành phần dữ liệu một… Câu trả lời là hệ điều hành Windows sẽ cung cấp một cơ chế gọi ngược (callback). Nói một cách đơn giản, chúng ta sẽ thông báo với hệ thống rằng khi hệ thống cung cấp các dữ liệu mà ta yêu cầu thì hãy xử lý theo những công việc mà ta đề ra. Hàm mà chứa các công việc ta giao cho hệ thống làm được gọi là hàm gọi ngược (callback function). Một hàm gọi ngược là một hàm do ứng dụng của người dùng tự định nghĩa và được thực thi bởi hệ điều hành mỗi khi có sự kiện liên quan đến hàm xảy ra. 111
- 3.3.2 EnumWindows Để lấy được danh sách các ứng dụng đang chạy, ta sẽ sử dụng cơ chế gọi ngược. Theo cơ chế gọi ngược, hệ điều hành Windows cung cấp một loạt các hàm liệt kê bắt đầu bằng từ Enum (enumerate : liệt kê) như và … EnumWindows. EnumFontFamilliesEx, EnumForms EnumWindows chính là hàm ta cần: Hàm EnumWindows Chức năng: liệt kê tất cả cửa sổ top-level trên màn hình bằng cách trả về handle của từng cửa sổ một cho một hàm gọi ngược của ứng dụng định nghĩa. Việc liệt kê sẽ kết thúc khi đến cửa sổ cuối hoặc hàm gọi ngược trả về FALSE. BOOL EnumWindows( WNDENUMPROC lpEnumFunc, LPARAM lParam ); Ý nghĩa tham số: [in] lpEnumFunc : trỏ đến hàm gọi ngược. lParam : giá trị do ứng dụng định nghĩa và chuyển cho hàm gọi ngược. Giá trị trả về: [out] Nếu thành công, trả về khác 0. Nếu thất bại, trả về 0. Để biết lỗi, gọi GetLastError. Định nghĩa hàm gọi ngược của EnumWindows. Chức năng: hàm gọi ngược của EnumWindows. BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam ); Ý nghĩa tham số: 112
- [in] hwnd : handle của top-level windows. lParam : giá trị do ứng dụng định nghĩa và chuyển cho hàm gọi ngược (là tham số lParam trong hàm EnumWindows). Giá trị trả về: [out] Để tiếp tục liệt kê cửa sổ, hàm phải trả về TRUE. Ngược lại, trả về FALSE. Có một lưu ý nhỏ ở đây : ta vẫn có thể sử dụng hàm tương tự là EnumDesktopWindows, là hàm liệt kê tất cả cửa sổ trên desktop. Tuy nhiên, ta có thể lấy thiếu một số cửa sổ người dùng khi sử dụng hàm này. Ngược lại, hàm EnumWindows lại có nhược điểm nhỏ là lấy dư các cửa sổ của hệ thống. Các cửa sổ này không phải là các cửa sổ chúng ta cần, vì vậy ta phải có các thao tác loại bỏ chúng đi. 3.3.3 Lấy danh sách các ứng dụng đang chạy: Ta chỉ cần viết một hàm gọi ngược thực hiện các công việc sau: o Nếu là cửa sổ gọi hàm EnumWindows, bỏ qua. o Nếu là tiểu trình, bỏ qua. o Nếu là cửa sổ ẩn, bỏ qua. o Nếu là cửa sổ không có tiêu đề, bỏ qua. o Nếu là cửa sổ Program Manager, bỏ qua. o Nếu là cửa sổ đang chạy của người dùng (thỏa các điều kiện lọc), lưu lại tên. Hàm ListWindows: Chức năng : hàm gọi ngược thực hiện các công việc trên. BOOL CALLBACK CTaskMgr::ListWindows(HWND hwnd, LPARAM lParam) Ý nghĩa tham số và giá trị trả về: giống mô tả của hàm gọi ngược nêu ở trên. Ở đây, tham số lParam là con trỏ trỏ đến cấu trúc WIN_TEXT_LIST do ta tự định nghĩa để lưu lại tên các ứng dụng: 113
- typedef struct { HWND hWnd; //cua so ma ham CALLBACK thuoc ve CStringArray sarWinText; //array luu window title } WIN_TEXT_LIST; Ý nghĩa cấu trúc khá đơn giản, như đã ghi trong phần chú thích của cấu trúc. Đến đây, mục tiêu để ra đã hoàn tất, ta có thể tùy nghi sử dụng danh sách vào các mục đích khác nhau, như bật và tắt ứng dụng đang chạy. 3.3.4 Tắt một ứng dụng đang chạy: Việc tắt một ứng dụng đang chạy không khó nếu tắt biết rằng ta cần tắt cửa sổ nào. Điều này nghe có vẻ quá hiển nhiên, ta có thể nói rằng “Tôi biết chứ ! Tôi cần tắt cửa sổ này, tên cửa sổ đó là…”, nhưng đối với hệ điều hành Windows tên cửa sổ không có một ý nghĩa gì cả. Điều hệ điều hành cần đó là handle của cửa sổ. Do vậy ta sẽ viết một hàm đóng cửa sổ khi biết tên cửa sổ. Sau đó, mọi việc còn lại quá đơn giản: CWnd* wnd = CWnd::FromHandle(handle); wnd->PostMessage(WM_CLOSE); Ta chỉ làm cửa sổ tự gởi một thông điệp WM_CLOSE cho chính nó. Sau đó, cửa sổ sẽ đóng. Ta không quá lo lắng việc đóng có thành công hay không vì đây thông thường chỉ là các cửa sổ ứng dụng của người dùng, ngoài ra, nếu cửa sổ có chứa dữ liệu mà người dùng chưa lưu (chẳng hạn, ta cần đóng cửa sổ Winword mà người dùng đang gõ văn bản…) hệ điều hành Windows sẽ thông báo hỏi người dùng. Người dùng có thể chọn không đóng cửa sổ. Khi ấy, ta sẽ yêu cầu đóng cửa sổ vào lúc thích hợp khác. Hàm CloseWindow Chức năng: đóng cửa sổ khi biết tên của nó. BOOL CTaskMgr::CloseWindow(LPCTSTR sWinTitle) Hàm CloseWindow sẽ làm các công việc : 114
- o Lấy handle cửa sổ desktop. Cửa sổ này là cửa sổ cha của mọi cửa sổ đang chạy trên màn hình. o Từ cửa sổ desktop, duyệt qua từng cửa sổ con của desktop. o Nếu tìm thấy cửa sổ nào có tên phù hợp với cửa sổ ta cần tìm, đóng nó lại. Hình 3-10 Tắt một ứng dụng đang chạy 3.3.5 Mở một ứng dụng Việc mở một ứng dụng bằng mã lệnh thực thi không khó nếu ta sử dụng đúng hàm API do Windows cung cấp. Ở đây, chỉ có điểm lưu ý nhỏ là ứng dụng chạy nên nêu rõ đường dẫn tuyệt đối. Khi ta sử dụng đường dẫn tương đối, chẳng hạn “control.exe”, hệ điều hành sẽ dò tìm ứng dụng trong: Nơi chứa chương trình ứng dụng Thư mục hiện hành Thư mục system/system32 Thư mục Windows Các thư mục liệt kê trong biến môi trường PATH Vì vậy, có thể ứng dụng không thể được kích hoạt. Hàm ShellExecute: 115
- Chức năng: thực hiện một thao tác (mở, thực thi, tìm kiếm …) một tập tin hay thư mục. HINSTANCE ShellExecute( HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd ); Ý nghĩa tham số: [in] hwnd : handle cửa sổ gọi. lpOperation : thao tác lên tập tin: edit : dùng một trình xử lý văn bản mở tập tin. Nếu lpFile không phải là một tập tin văn bản, thao tác sẽ thất bại. explore : mở thư mục lpFile. find : tìm kiếm trên thư mục lpFile. open : mở tập tin lpFile. lpFile có thể là một tập tin thực thi, văn bản, hay thư mục. print: in tập tin lpFile. Nếu lpFile không phải là một tập tin văn bản, thao tác sẽ thất bại. NULL : Các phiên bản trước Windows 2000: tên thao tác mặc định quy định trong registry. Nếu không, thao tác “open” sẽ được dùng. Các phiên bản từ Windows 2000: tên thao tác mặc định quy định trong registry. Nếu không, thao tác “open” sẽ được dùng. Nếu vẫn không được, hệ điều hành sẽ dùng thao tác đầu tiên đăng ký vào danh sách trong registry. lpFile: tên tập tin hay thư mục. 116
- lpParameters : tham số dành cho lpFile nếu lpFile là một tập tin thực thi. Nếu lpFile là một tập tin văn bản, lpParameters nên đặt là NULL. lpDirectory : đường dẫn tuyệt đối. nShowCmd : SW_HIDE Giấu cửa sổ. SW_MAXIMIZE Phóng to hết cỡ cửa sổ. SW_MINIMIZE Thu nhỏ cửa sổ. SW_RESTORE Phục hồi cửa sổ về kích thước mặc định của nó. SW_SHOW Hiện cửa sổ theo kích thước mặc định của nó. SW_SHOWDEFAULT Đặt trạng thái mặc định của cửa sổ khi mở là hiện ra. SW_SHOWMAXIMIZED Hiện và phóng to hết cỡ cửa sổ. SW_SHOWMINIMIZED Hiện và thu nhỏ cửa sổ. SW_SHOWMINNOACTIVE Thu nhỏ cửa sổ nhưng không kích hoạt nó. SW_SHOWNA Hiện cửa sổ như trạng thái mà nó đã quy định. SW_SHOWNOACTIVATE Hiện cửa sổ nhưng không kích hoạt nó. SW_SHOWNORMAL Hiện và kích hoạt cửa sổ. Giá trị trả về: 117
- [out] Nếu thành công, trả về giá trị lớn hơn 32. Nếu thất bại, trả lỗi. Áp dụng vào chương trình: (int)ShellExecute(NULL, "open", lpFile, lpParam, lpPath, SW_SHOW); Với lpFile, lpParam, lpPath lần lượt là các giá trị lpFile, lpParameters, lpDirectory đã giải thích ở trên. Lưu ý rằng, ta phải ép kiểu “(int)” khi lấy kết quả vì nguyên hàm của hàm có trị trả về là HINSTANCE. Thực chất, kiểu trị trả về như thế để tương thích ngược với các ứng dụng 16-bit cũ. Hình 3-11 Mở một ứng dụng 3.4 Điều khiển máy tính từ xa: Trong quá trình thực hiện phần mềm, có một yêu cầu quản trị hệ thống là người quản trị cần log out, restart và shutdown một máy tính hoặc các máy đang hoạt động. Điều này có thể thực hiện thông qua các hàm API hệ thống của Windows nhưng trước hết, ta cần phải biết thêm cơ chế đăng nhập của hệ điều hành Windows. 118
- 3.4.1 Cơ chế đăng nhập: 3.4.1.1 Winlogon: Cơ chế đăng nhập của Windows, Winlogon được thiết kế theo mô hình đăng nhập tương tác gồm 3 phần : thành phần thực thi (“winlogon.exe”), thư viện liên kết động “Chứng thực và nhận dạng theo cơ chế đồ họa” (Graphical Identification and Authentication GINA) (“msgina.dll”), và các thành phần mạng. Để biết thêm về GINA, xem Phụ lục GINA stub – kỹ thuật xây dựng. Quá trình đăng nhập được mô tả như sau: Người Hệ thống Người Dựa vào thẻ dùng cấp một dùng sử bài, hệ thống đăng thẻ bài truy dụng tài quyết định nhập hệ cập (access nguyên hệ xem người token) cho dùng có được thống thống sử dụng tài người dùng nguyên hay không. Hệ thống Người dùng chấp nhận thóat khỏi hệ và hủy thẻ thống bài Hình 3-12 Quá trình đăng nhập * thẻ bài truy cập (access token): Một thẻ bài truy cập chứa đựng thông tin bảo mật của session đăng nhập. Hệ thống tạo thẻ bài khi người dùng đăng nhập, và mỗi tiến trình thực thi dưới quyền của người dùng đều có một bản sao của thẻ bài. Thẻ bài xác định người dùng, nhóm người dùng và đặc quyền của người dùng. Hệ thống dùng thẻ bài để kiểm soát việc truy cập đến các đối tượng bảo mật và khống chế các hoạt động liên quan đến hệ 119
- thống của người dùng. Tùy thuộc vào đặc quyền của người dùng, mà mức độ khống chế cao hay thấp. Chẳng hạn, quản trị viên có toàn quyền đối với hệ thống. 3.4.1.2 Phân tích: Vậy việc ta phải làm là : Lấy thẻ bài của người dùng. • Với thẻ bài, kiểm tra xem người dùng có đặc quyền log out, restart, • shutdown hay không. Nếu có, bật đặc quyền lên (cho phép các tiến trình sử dụng đặc quyền để • thực hiện thao tác log out, restart, hay shutdown trên hệ thống). Nếu thành công. công việc hoàn tất. • 3.4.2 Các hàm API hệ thống được sử dụng: 3.4.2.1 OpenProcessToken Chức năng : mở thẻ bài truy cập của tiến trình. khi biết handle. BOOL OpenProcessToken( HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle ); Ý nghĩa tham số: [in] ProcessHandle : handle của tiến trình. DesiredAccess : quyền truy cập yêu cầu. [out] TokenHandle : handle của thẻ bài. Giá trị trả về: [out] Nếu thành công, trả về khác 0. 120
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Quản trị văn phòng - ThS. Phạm Thị Ngân
81 p | 2741 | 941
-
Bài giảng môn Quản trị văn phòng - GV.Phạm Thị Minh Lan
141 p | 847 | 219
-
GIÁO TRÌNH QUẢN LÝ CHẤT LƯỢNG TRANG PHỤC - CHƯƠNG V QUẢN LÝ CHẤT LƯỢNG QUA CÁC CÔNG ĐOẠN CỦA QUÁ TRÌNH SẢN XUẤT MAY CÔNG NGHIỆP
46 p | 707 | 162
-
HƯỚNG DẪN KỸ THUẬT LẬP BẢN CAM KẾT BẢO VỆ MÔI TRƯỜNG DỰ ÁN XÂY DỰNG KHO XĂNG DẦU QUY MÔ NHỎ (Dung tích dưới 1.000m3)
35 p | 224 | 54
-
Luận văn thạc sỹ - Mô phỏng liên tục tring quản lý dự án - Chương 6
21 p | 182 | 33
-
Bài giảng Quản trị hành chính văn phòng: Chương 3 - ThS. Nguyễn Văn Báu
29 p | 125 | 33
-
Bài giảng Kỹ thuật xây dựng và ban hành văn bản quản lý hành chính Nhà nước: Chương 4, 5 - ThS. Tạ Thị Thanh Tâm
76 p | 161 | 26
-
Bài giảng Quản lý dự án: Chương 2 - GS.TS. Bùi Xuân Phong
9 p | 131 | 17
-
Tài liệu bồi dưỡng Lãnh đạo, quản lý cấp huyện - Chuyên đề 5
25 p | 232 | 15
-
Quản lý đất đai ở Việt Nam (1945-2010) - TS. Nguyễn Đình Bồng
148 p | 59 | 13
-
Chương trình đào tạo, bồi dưỡng lãnh đạo cấp phòng
33 p | 148 | 11
-
Chương trình đào tạo liên tục an toàn người bệnh
24 p | 144 | 8
-
Bài giảng Luật Xây dựng: Chương 5 - Nguyễn Quốc Lâm
30 p | 33 | 8
-
Các chương trình quản lý phòng máy hiện nay ở Việt Nam - 2
25 p | 61 | 7
-
Bài giảng Quản lý học: Chương 6 - TS. Nguyễn Hữu Xuyên
9 p | 22 | 6
-
Các chương trình quản lý phòng máy hiện nay ở Việt Nam - 7
25 p | 59 | 5
-
Bài giảng Quản lý dự án cho kỹ sư: Chương 5 - Lê Phước Luông
8 p | 9 | 2
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn