2009-04-11 64 views
13

Tôi muốn ẩn cửa sổ của ứng dụng khác khỏi thanh tác vụ mà không ẩn cửa sổ. Cụ thể, tôi muốn có một số trình duyệt web khác nhau đang chạy, hiển thị, có sẵn trong danh sách Alt + Tab, nhưng không chiếm dung lượng trên thanh tác vụ.Ẩn nút thanh tác vụ của ứng dụng khác

(Nếu ai đó tò mò tại sao: Tôi đã viết một ứng dụng bảng điều khiển sử dụng API DwmRegisterThumbnail của Vista để hiển thị xem trước trực tiếp một số cửa sổ cùng một lúc - một loại "hình ảnh trong ảnh", nếu bạn làm như vậy. cũng có các nút trên thanh tác vụ cho các cửa sổ đó có vẻ dư thừa.)

Tôi biết rằng việc thay đổi kiểu cửa sổ khác để bao gồm WS_EX_TOOLWINDOW sẽ ẩn nó khỏi thanh tác vụ và tôi đã thử điều này trước. Nhưng, như mong đợi, nó có một số tác dụng phụ tôi không muốn: thanh tiêu đề có ngắn hơn (không phải tất cả xấu, tôi đoán) và các nút thu nhỏ và tối đa hóa đã biến mất (không tốt). Tôi cũng phải ẩn và hiển thị lại cửa sổ để có được thanh tác vụ để nhận ra sự thay đổi, điều này gây ra hiện tượng vẽ lại khi tôi đã làm điều đó với cửa sổ IE.

Suy nghĩ tiếp theo của tôi là, vì các cửa sổ có chủ sở hữu bị ẩn khỏi thanh tác vụ theo mặc định, có thể tôi có thể thay đổi các cửa sổ khác do tôi sở hữu. Nhưng MSDN là pretty clear rằng "[a] fter tạo một cửa sổ thuộc sở hữu, một ứng dụng không thể chuyển quyền sở hữu của cửa sổ sang một cửa sổ khác."

Tôi tìm thấy this question được viết tương tự như của tôi, nhưng nó đặc biệt về cửa sổ từ quy trình của riêng bạn, nơi bạn có toàn quyền kiểm soát quyền sở hữu cửa sổ.

Có ai biết về bất kỳ cách nào khác để ẩn nút thanh tác vụ, thao tác này sẽ hoạt động đối với các cửa sổ từ một quy trình khác không?


Cập nhật: Tormod đưa tôi đi đúng hướng với ITaskbarList - nó hoạt động tuyệt vời. Trang pinvoke.net có một số lỗi (sai GUID, các phương thức được khai báo theo thứ tự bảng chữ cái thay vì theo thứ tự giao diện), nhưng tôi đã chỉnh sửa nó, sửa lỗi và cũng thêm một ví dụ về cách khởi tạo ITaskbarList qua coclass của nó.

Cập nhật 2: Nếu bạn sử dụng DeleteTab để ẩn nút trên thanh tác vụ của một cửa sổ, và sau đó hãy chắc rằng cửa sổ hoạt động (ví dụ qua SetForegroundWindow hoặc Alt + Tab), nút trên thanh tác vụ của nó sẽ xuất hiện trở lại. Để giữ nút thanh tác vụ bị ẩn, tôi phải thêm bộ hẹn giờ và tiếp tục gọi DeleteTab. Miễn là bạn không nhớ nút thanh tác vụ xuất hiện lại một thời gian ngắn bất cứ khi nào cửa sổ được tập trung, điều này hoạt động tốt.

Trả lời

6

Từ MSDN:

Version 4.71 và sau của shell32.dll thêm khả năng để sửa đổi các nội dung của thanh tác vụ. Từ một ứng dụng, bạn có thể thêm, xóa và kích hoạt các nút trên thanh tác vụ. Kích hoạt mục không kích hoạt cửa sổ; nó hiển thị mục như được nhấn trên thanh tác vụ.

Khả năng sửa đổi thanh tác vụ được triển khai trong đối tượng Mô hình đối tượng thành phần (COM) (CLSID_TaskbarList) hiển thị giao diện ITaskbarList (IID_ITaskbarList). Bạn phải gọi phương thức ITaskbarList :: HrInit để khởi tạo đối tượng. Sau đó, bạn có thể sử dụng các phương thức của giao diện ITaskbarList để sửa đổi nội dung của thanh tác vụ.

Dường như COM interop là cách để xử lý nội dung của thanh tác vụ một cách đáng tin cậy.Đặc biệt, bạn sẽ cần phải gọi các chức năng sau:

Bạn có thể tìm ra C# chữ ký cho giao diện ITaskbarList tại pinvoke.net: ITaskbarList.

+0

Ngọt - Tôi không bao giờ biết về điều này, nhưng nó có vẻ giống như vé. Cảm ơn! –

0

Bạn đã thử xóa WS_EX_APPWINDOW?

+0

Vâng, tôi đã làm. Điều đó chỉ hoạt động nếu ứng dụng khác phải thêm 'WS_EX_APPWINDOW' vào vị trí đầu tiên, ví dụ: nếu nó có cửa sổ chủ sở hữu. Cửa sổ cấp cao thông thường không cần 'WS_EX_APPWINDOW', vì vậy nó không có để loại bỏ. –

Các vấn đề liên quan