2009-08-18 46 views
62

Nếu bạn đã nhận thấy trong bản beta Windows 7, nếu bạn sao chép tệp hoặc các tác vụ hệ thống khác, biểu tượng trình khám phá cửa sổ trên thanh tác vụ sẽ điền vào thanh tiến trình màu xanh lục tương đương với thanh tiến trình trên biểu mẫu. Có cách nào, trong các hình thức C# của tôi, tôi có thể buộc thanh tiến trình thanh tác vụ của tôi khớp với tiến trình của bất kỳ tác vụ nào tôi đang làm không? Chuyển đổi, chuyển giao, tạo ra, có rất nhiều công dụng cho thanh tiến trình đó.Thanh tiến trình Windows 7 trong thanh tác vụ trong C#?

Trả lời

44

Đối với những người muốn bỏ qua việc đọc tài liệu hướng dẫn và chỉ nhận được một cái gì đó mà làm việc ...

  • Tải xuống Windows API Code Pack for Microsoft .Net Framework.
  • Chạy trình cài đặt mà tạo ra một tập tin zip
  • Giải nén file dll sau từ thư mục binaries của file zip:
    • Microsoft.WindowsAPICodePack.dll
    • Microsoft.WindowsAPICodePack.Shell.dll
  • Thêm một tham chiếu đến chúng trong bạn dự án
  • Đặt mã sau đây vào ứng dụng của bạn và sửa đổi khi cần thiết:

-

int max = 100; 
    var prog = Microsoft.WindowsAPICodePack.Taskbar.TaskbarManager.Instance; 
    prog.SetProgressState(Microsoft.WindowsAPICodePack.Taskbar.TaskbarProgressBarState.Normal); 
    for(int i=0;i<max;i++) { 
    prog.SetProgressValue(i, max); 
    Thread.Sleep(100);  
    } 
    prog.SetProgressState(Microsoft.WindowsAPICodePack.Taskbar.TaskbarProgressBarState.NoProgress); 
+0

Tải xuống của nuget hơi khó chịu, nhưng yea, hoạt động tốt. Thực hiện trong lớp xử lý thanh tiến trình của tôi :) – Nyerguds

0

Tôi tìm thấy một bài viết đẹp (Link) mà cung cấp một giải pháp đơn giản cho vấn đề thanh tiến trình thanh tác vụ. Nói tóm lại, nó hướng dẫn bạn tải về gói Windows API from the MSDN website, thêm một tham chiếu đến Microsoft.WindowsAPICodePack.Shell.dll mà nó chứa, và cuối cùng là thêm ba dòng mã vào ứng dụng của bạn:

Imports Microsoft.WindowsAPICodePack 
Imports Microsoft.WindowsAPICodePack.Taskbar 
// ... 
TaskbarManager.Instance.SetProgressValue(X, 100) 

trong đó X là tiến trình bạn muốn hiển thị.

+2

Lưu ý rằng [câu trả lời chỉ có liên kết được khuyến khích] (http://meta.stackoverflow.com/tags/link-only-answers/info), các câu trả lời SO phải là điểm kết thúc của một tìm kiếm cho một giải pháp (so với một điểm dừng khác của tài liệu tham khảo, mà có xu hướng để có được cũ theo thời gian). Vui lòng xem xét thêm bản tóm tắt độc lập tại đây, giữ liên kết dưới dạng tham chiếu. – kleopatra

58

Tôi chỉ muốn thêm một số hoạt ảnh tiến trình thanh tác vụ vào ứng dụng WinForms của mình, mà không phải tải xuống gói mã hoặc chuyển sang WPF để sử dụng TaskbarItemInfo.

Giải pháp là một lớp có sử dụng giao diện ITaskbarList3:

using System; 
using System.Runtime.InteropServices; 

public static class TaskbarProgress 
{ 
    public enum TaskbarStates 
    { 
     NoProgress = 0, 
     Indeterminate = 0x1, 
     Normal  = 0x2, 
     Error   = 0x4, 
     Paused  = 0x8 
    } 

    [ComImport()] 
    [Guid("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf")] 
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    private interface ITaskbarList3 
    { 
     // ITaskbarList 
     [PreserveSig] 
     void HrInit(); 
     [PreserveSig] 
     void AddTab(IntPtr hwnd); 
     [PreserveSig] 
     void DeleteTab(IntPtr hwnd); 
     [PreserveSig] 
     void ActivateTab(IntPtr hwnd); 
     [PreserveSig] 
     void SetActiveAlt(IntPtr hwnd); 

     // ITaskbarList2 
     [PreserveSig] 
     void MarkFullscreenWindow(IntPtr hwnd, [MarshalAs(UnmanagedType.Bool)] bool fFullscreen); 

     // ITaskbarList3 
     [PreserveSig] 
     void SetProgressValue(IntPtr hwnd, UInt64 ullCompleted, UInt64 ullTotal); 
     [PreserveSig] 
     void SetProgressState(IntPtr hwnd, TaskbarStates state); 
    } 

    [ComImport()]  
    [Guid("56fdf344-fd6d-11d0-958a-006097c9a090")] 
    [ClassInterface(ClassInterfaceType.None)] 
    private class TaskbarInstance 
    { 
    } 

    private static ITaskbarList3 taskbarInstance = (ITaskbarList3)new TaskbarInstance(); 
    private static bool taskbarSupported = Environment.OSVersion.Version >= new Version(6, 1); 

    public static void SetState(IntPtr windowHandle, TaskbarStates taskbarState) 
    { 
     if (taskbarSupported) taskbarInstance.SetProgressState(windowHandle, taskbarState); 
    } 

    public static void SetValue(IntPtr windowHandle, double progressValue, double progressMax) 
    { 
     if (taskbarSupported) taskbarInstance.SetProgressValue(windowHandle, (ulong)progressValue, (ulong)progressMax); 
    } 
} 

Ví dụ về cách dễ dàng là để sử dụng:

TaskbarProgress.SetState(this.Handle, TaskbarProgress.TaskbarStates.Indeterminate); 

or 

TaskbarProgress.SetValue(this.Handle, 50, 100); 
TaskbarProgress.SetState(this.Handle, TaskbarProgress.TaskbarStates.Error); 
+3

Đây là một câu trả lời tuyệt vời; không có phụ thuộc hoặc tải xuống bên ngoài và chỉ hoạt động – Ben

+1

Nếu bạn muốn thêm SetOverlayIcon, như tôi đã làm, hãy chắc chắn thêm tất cả các phương thức bổ sung * theo thứ tự đúng *. Xem câu trả lời được chấp nhận cho http://stackoverflow.com/questions/1024786/windows-7-taskbar-setoverlayicon-from-wpf-app-doesnt-work –

+0

Thật không may, điều này phá vỡ các ứng dụng khi chạy trên Windows XP! Bất kì giải pháp nào? –

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