Hãy nhìn vào thanh tác vụ của bạn. Bạn có thấy khu vực có thời gian không? Có các biểu tượng khác ở đó không? Nơi được gọi là khay hệ thống Windows. Bạn có muốn đặt biểu tượng ứng dụng Delphi của mình ở đó không? Bạn có muốn biểu tượng đó hoạt hình hoặc phản ánh trạng thái ứng dụng của mình không?
Điều này sẽ hữu ích cho các chương trình chạy trong thời gian dài mà không có sự tương tác của người dùng (các tác vụ nền thường chạy trên PC của bạn suốt cả ngày).
Những gì bạn có thể làm là làm cho các ứng dụng Delphi của bạn trông giống như chúng được thu nhỏ vào khay (thay vì thanh tác vụ, trực tiếp vào nút Win Start) bằng cách đặt một biểu tượng trong khay và đồng thời làm cho (các) biểu mẫu của bạn ẩn đi .
chúng ta hãy đi khay
May mắn thay, việc tạo một ứng dụng chạy trong khay hệ thống khá dễ dàng: chỉ cần một chức năng (API), Shell_NotifyIcon, để hoàn thành nhiệm vụ.
Hàm được xác định trong đơn vị ShellAPI và yêu cầu hai tham số. Đầu tiên là cờ cho biết biểu tượng được thêm, sửa đổi hay xóa và thứ hai là con trỏ tới cấu trúc TNotifyIconData chứa thông tin về biểu tượng. Điều đó bao gồm phần điều khiển của biểu tượng sẽ hiển thị, văn bản sẽ hiển thị dưới dạng chú giải công cụ khi di chuột qua biểu tượng, phần điều khiển của cửa sổ sẽ nhận thông báo từ biểu tượng và loại thông báo mà biểu tượng sẽ gửi đến cửa sổ này . .
Đầu tiên, trong phần Riêng tư của biểu mẫu chính của bạn, hãy đặt dòng:
TrayIconData: TNotifyIconData;
gõ thủ tục TMainForm
= class (TForm) FormCreate(Sender: TObject); TrayIconData riêng tư : TNotifyIconData; { khai báo riêng } công khai { khai báo công khai } end ;
Sau đó, trong phương thức OnCreate của biểu mẫu chính của bạn , hãy khởi tạo cấu trúc dữ liệu TrayIconData và gọi hàm Shell_NotifyIcon:
với TrayIconData dobegin
cbSize := SizeOf(TrayIconData);
Gió := Xử lý;
uID := 0;
uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
uCallbackMessage := WM_ICONTRAY;
hIcon := Application.Icon.Handle;
StrPCopy(szTip, Application.Title);
kết thúc ;
Shell_NotifyIcon(NIM_ADD, @TrayIconData);
Tham số Wnd của cấu trúc TrayIconData trỏ đến cửa sổ nhận thông báo thông báo được liên kết với một biểu tượng.
hIcon trỏ đến biểu tượng chúng ta muốn thêm vào Khay; trong trường hợp này, biểu tượng Ứng dụng chính được sử dụng.
szTip chứa văn bản chú giải công cụ để hiển thị biểu tượng, trong trường hợp của chúng tôi là tiêu đề ứng dụng. szTip có thể chứa tối đa 64 ký tự.
Tham số uFlags được đặt để yêu cầu biểu tượng xử lý thông báo ứng dụng, sử dụng biểu tượng ứng dụng và gợi ý của nó. uCallbackMessage trỏ đến số nhận dạng tin nhắn do ứng dụng xác định . Hệ thống sử dụng mã định danh đã chỉ định cho các thông báo mà nó gửi tới cửa sổ được xác định bởi Wnd bất cứ khi nào một sự kiện chuột xảy ra trong hình chữ nhật bao quanh biểu tượng.Tham số này được đặt thành hằng số WM_ICONTRAY được xác định trong phần giao diện của đơn vị biểu mẫu và bằng: WM_USER + 1;
Biểu tượng được thêm vào khay bằng cách gọi hàm API Shell_NotifyIcon. Tham số đầu tiên “NIM_ADD” thêm một biểu tượng vào khu vực khay. Hai giá trị có thể khác, NIM_DELETE và NIM_MODIFY, được sử dụng để xóa hoặc sửa đổi một biểu tượng trong Khay; chúng ta sẽ xem làm thế nào sau này trong bài viết này. Tham số thứ hai mà chúng tôi chuyển đến Shell_NotifyIcon là cấu trúc TrayIconData đã khởi tạo.
lấy một
Nếu bạn chạy dự án của mình bây giờ, bạn sẽ thấy một biểu tượng gần đồng hồ trong khay. Giữ ba điều trong tâm trí.
1) Trước hết, không có gì xảy ra khi bạn nhấp (hoặc làm bất kỳ thao tác nào khác bằng chuột) vào biểu tượng nằm trong Khay; chúng tôi chưa tạo một thủ tục (trình xử lý tin nhắn).
2) Thứ hai, có một nút trên thanh tác vụ (rõ ràng là chúng tôi không muốn nó ở đó).
3) Thứ ba, khi bạn đóng ứng dụng của mình, biểu tượng vẫn ở trong Khay.
Lấy hai
Hãy giải quyết vấn đề này ngược lại. Để xóa biểu tượng khỏi khay khi bạn thoát khỏi ứng dụng, bạn phải gọi lại Shell_NotifyIcon, nhưng với NIM_DELETE làm tham số đầu tiên. Điều này được thực hiện trong trình xử lý sự kiện OnDestroy cho biểu mẫu chính.
thủ tục TMainForm.FormDestroy(Sender: TObject);
bắt đầu
Shell_NotifyIcon(NIM_DELETE, @TrayIconData);
kết thúc ;
Để ẩn ứng dụng (nút ứng dụng) khỏi thanh tác vụ, chúng tôi sẽ sử dụng một thủ thuật đơn giản. Trong mã nguồn Dự án, hãy thêm dòng sau: Application.ShowMainForm := False; trước Application.CreateForm(TMainForm, MainForm); Ví dụ: làm cho nó trông giống như:
...
khởi động
Application.Initialize;
Application.ShowMainForm := Sai;
Application.CreateForm(TMainForm, MainForm);
Ứng dụng.Run;
cuối cùng.
Và cuối cùng, để biểu tượng khay của chúng tôi phản hồi các sự kiện chuột, chúng tôi cần tạo quy trình xử lý thông báo. Đầu tiên, chúng ta khai báo một thủ tục xử lý thông báo trong phần công khai của khai báo biểu mẫu: thủ tục TrayMessage(var Msg: TMessage); tin nhắn WM_ICONTRAY; Thứ hai, định nghĩa của thủ tục này trông như thế này:
thủ tục TMainForm.TrayMessage( var Msg: TMessage);
begincase Msg.lParam của
WM_LBUTTONDOWN:
begin
ShowMessage('Đã nhấn nút trái
- CHÚNG TÔI HIỂN THỊ biểu mẫu!');
MainForm.Show;
kết thúc ;
WM_RBUTTONDOWN:
begin
ShowMessage('Nút phải xuống
- HÃY ẨN biểu mẫu!');
MainForm.Hide;
kết thúc ;
kết thúc ;
kết thúc ;
Quy trình này được thiết kế để chỉ xử lý thông báo của chúng tôi, WM_ICONTRAY. Nó nhận giá trị LParam của cấu trúc thông báo có thể cung cấp cho chúng ta trạng thái của chuột khi kích hoạt thủ tục. Để đơn giản, chúng tôi sẽ chỉ xử lý chuột trái (WM_LBUTTONDOWN) và chuột phải (WM_RBUTTONDOWN). Khi nhấn nút chuột trái vào biểu tượng, chúng tôi hiển thị biểu mẫu chính, khi nhấn nút chuột phải, chúng tôi ẩn nó. Tất nhiên, có những thông báo nhập chuột khác mà bạn có thể xử lý trong quy trình, chẳng hạn như nút lên, nhấp đúp vào nút, v.v.
Đó là tất cả. Nhanh chóng và dễ dàng. Tiếp theo, bạn sẽ thấy cách tạo hiệu ứng động cho biểu tượng trong khay và cách làm cho biểu tượng đó phản ánh trạng thái ứng dụng của bạn. Hơn nữa, bạn sẽ thấy cách hiển thị menu bật lên gần biểu tượng.