• delphi如何让程序最小化到任务栏(使用Shell_NotifyIcon API函数)


    现在很多的应用程序都有这样一种功能,当用户选择最小化窗口时,窗口不是象平常那样最小化到任务栏上,而是“最小化”成一个任务栏图标。象FoxMail
    3.0 NetVampire
    3.0等都提供了这样的功能。实现这样的功能实际上并不复杂,在窗口最小化时,窗口会发出WM_SYSCOMMAND消息,你只要需要截取Windows的WM_SYSCOMMAND消息,在窗口最小化时隐藏窗口并调用WindowsAPI函数Shell_NotifyIcon将定义的图标添加到任务栏上,Shell_NotifyIcon的函数定义是这样的:function
    Shell_NotifyIcon(dwMessage:DWORD; lpData: PNotifyIconData): BOOL; stdcall;
    其中的参数dwMessage指定Shell_NotifyIcon函数的操作,可以是NIM_ADD NIM_DELETE
    NIM_MODIFY三个值中的一个,分别对应添加图标、删除图标、修改图标的动作。

    ---- 参数lpData指向的PNotifyIconData结构的定义如下:

    _NOTIFYICONDATAW =
    record

    cbSize: DWORD;
    Wnd: HWND;
    uID: UINT;
    uFlags:
    UINT;
    uCallbackMessage: UINT;
    hIcon: HICON;
    szTip: array
    [0..63] of WideChar;
    end;

    TNotifyIconData = _NOTIFYICONDATAW;
    ----
    在这个结构中Wnd指明所属的窗口,UCallbackMessage指明回调消息,如果指明了Wnd和
    uCallbackMessage,则当用户对任务栏图标有动作(如点击图标,在图标上移动光标等)。系统都会发送uCallbackMessage消息给Wnd指定的窗口。hIcon是要添加的图标的句柄,szTip
    是图标的提示行(就是当移动光标到图标上,出现的一个小黄方框内出现的文字)。消息。实现上面的功能,最主要的是要处理WM_SYSCOMMAND消息和自定义的图标消息,这些消息在Delphi中并没有相应的事件。这里就需要使用到Delphi的自定义消息处理功能来截取并处理这些消息。

    ----
    首先看下面的程序。在执行程序之前,首先要改变Form1的Icon属性,给Form1装入一个图标,否则在任务栏上会出现一块空白。

    unit Unit1; 
    interface 
    uses 
    Windows, Messages, SysUtils,  
    Classes, Graphics, Controls, Forms, 
    Dialogs,ShellAPI; 
    
    const 
    WM_BARICON=WM_USER+200; 
    
    type 
    TForm1 = class(TForm) 
    private 
        procedure WMSysCommand(var Message: TMessage); message WM_SYSCOMMAND; 
        procedure WMBarIcon(var Message:TMessage);message WM_BARICON; 
       { Private 
    declarations } 
    public 
       
    { Public declarations } 
    end; 
    
    var 
    Form1: 
    TForm1; 
    
    implementation 
    
    {$R *.DFM} 
    procedure TForm1.WMSysCommand 
    (var Message:TMessage); 
    var 
       lpData:PNotifyIconData; 
    begin 
    if Message.WParam = SC_ICON then 
    begin 
        //如果用户最小化窗口则将窗口隐藏并在任务栏上添加图标     
        lpData := new(PNotifyIconDataA); 
        lpData.cbSize := 88; 
        //SizeOf(PNotifyIconDataA); 
        lpData.Wnd := Form1.Handle; 
        lpData.hIcon := Form1.Icon.Handle; 
        lpData.uCallbackMessage := WM_BARICON; 
        lpData.uID :=0; 
        lpData.szTip := 'Samples'; 
        lpData.uFlags := NIF_ICON  or NIF_MESSAGE or NIF_TIP; 
        Shell_NotifyIcon(NIM_ADD,lpData); 
        dispose(lpData); 
        Form1.Visible := False; 
    end 
    else 
    begin 
        //如果是其它的SystemCommand 消息则调用系统缺省处理函数处理之。     
        DefWindowProc(Form1.Handle,Message. 
        Msg,Message.WParam,Message.LParam); 
    end; 
    // 
    end; 
    
    procedure 
    TForm1.WMBarIcon(var Message:TMessage); 
    var 
       lpData:PNotifyIconData; 
    begin 
    if (Message.LParam = WM_LBUTTONDOWN) then 
       
    begin 
        //如果用户点击任务栏图标则将图标删除并回复窗口。 
        lpData := new(PNotifyIconDataA); 
        lpData.cbSize := 88;//SizeOf(PNotifyIconDataA); 
        lpData.Wnd := Form1.Handle; 
        lpData.hIcon := Form1.Icon.Handle; 
        lpData.uCallbackMessage := WM_BARICON; 
        lpData.uID :=0; 
        lpData.szTip := 'Samples'; 
        lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP; 
        Shell_NotifyIcon(NIM_DELETE,lpData); 
        dispose(lpData); 
        Form1.Visible := True; 
       end; 
    end; 
    
    end. 

    ----
    运行上面的程序,点击程序窗口标题栏上的最小化按钮,你就可以看到窗口被“最小化”成了一个任务栏图标,点击图标,窗口又会恢复原来的状态。

    ----
    从上面的程序可以看到,Delphi的自定义消息处理功能的实现也是十分简单的,首先在Form类的Private定义中加入自定义消息处理函数的定义,定义的描述如下:

    procedure UserPro(Var Message: TMessage):message
    WindowsMessage 其中UserPro是用户自定义消息处理函数的名称,
    WindowsMessage 是Windows消息常量或自定义消息常量。
    ---- 然后在程序中加入消息处理函数,函数的一般格式如下:

    Procedure UserClass.UserPro(Var Message:TMessage);

    var
    //加入定义

    Begin
    //加入程序语句

    End;
    其中UserClass是封装自定义消息处理函数的类的名称。
    ----
    最后,Delphi的自定义消息处理函数要涉及到Windows的消息的结构,在这里我就不多说了,大家可以参考Windows
    API帮助和Delphi的相关帮助信息。相信大家如果掌握了Delphi的自定义消息处理函数,一定可以编写出象VB一样简洁,象C++一样功能强大的程序来的。

    http://www.cnblogs.com/key-ok/p/4594662.html

  • 相关阅读:
    OpenWrt配置绿联的usb转Ethernet网口驱动
    SQL_wm_concat函数实验:实现字段合并
    BingMap频繁Add Pushpin和Delete Pushpin会导致内存泄露
    比較C++和Java 二
    【JAVASE】Java同一时候抛出多个异常
    uva 1463
    Android 撕衣服(刮刮乐游戏)
    轻松掌握一致性哈希算法
    Oracle之sql语句优化
    Eclipse导出Library
  • 原文地址:https://www.cnblogs.com/findumars/p/6353147.html
Copyright © 2020-2023  润新知