例如我要监听一个端口,比如379打印端口,做成一个服务。服务一启动,状态栏同时出现托盘图标,当检测到379端口值变了时,就弹出一个警世窗口。该过程大体如何实现呢?当然你可以监视某个变量的值,请高手来个demo

解决方案 »

  1.   

    这有什么问题嘛?看服务中有个 interactive 允许与桌面交互, 设 true新一个 Form, 作为 MainForm, Project->Options 里设, 桌面图标嘛,,unit Main;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Menus, ShellAPI, ActnList, ExtCtrls;const
      WM_INITIALIZE = WM_USER + 1;
      WM_SYSTEM_TRAY_ICON_MESSAGE = WM_USER + 2;type
      TMainForm = class(TForm)
        PopupMenu: TPopupMenu;
        ActionList1: TActionList;
        Shutdown: TAction;
        Properties: TAction;
        S1: TMenuItem;
        Setup: TAction;
        N1: TMenuItem;
        S2: TMenuItem;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
        procedure ShutdownExecute(Sender: TObject);
        procedure SetupExecute(Sender: TObject);
      public
        FInitialized: Boolean;
        FIconData: NOTIFYICONDATA;
        FTaskMessage: Cardinal;
        procedure RegisterIcon;
        procedure UnregisterIcon;
        procedure WMTrayIcon(var Message: TMessage); message WM_SYSTEM_TRAY_ICON_MESSAGE;
      protected
        procedure WndProc(var Message: TMessage); override;
      public
      end;resourcestring
      STip = '你的图标提示';
      
    var
      MainForm: TMainForm;
      FromService: Boolean;implementationuses Setting;{$R *.dfm}procedure TMainForm.FormCreate(Sender: TObject);
    begin
      RegisterIcon;
      FTaskMessage := RegisterWindowMessage('TaskbarCreated'); // 向Windows要求在任务栏建立时发出个消息, 主要为了服务在起动时, taskbar 不存在
      
      if FromService then
        Shutdown.Enabled := false; // Showdown 是一个 Action, 这个程序同时支持 App 和 Svc, Svc 的不能由菜单关闭
    end;procedure TMainForm.FormDestroy(Sender: TObject);
    begin
      UnregisterIcon;
    end;procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    ;
    end;procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
    ;
    end;procedure TMainForm.RegisterIcon;
    var
      Tip: string;
    begin
      begin
        // tray icon registr information
        FIconData.cbSize := sizeof(TNotifyIconData);
        FIconData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
        FIconData.uID := 0;
        FIconData.Wnd := Handle;
        FIconData.hIcon := Forms.Application.Icon.Handle; // 用的是 Application 的图标, 爱改就自已改一个
        FIconData.uCallbackMessage := WM_SYSTEM_TRAY_ICON_MESSAGE;
        Tip := STip;
        Delete(Tip, 63, Length(Tip) - 63);
        StrCopy(FIconData.szTip, PChar(Tip));
        Shell_NotifyIcon(NIM_ADD, @FIconData);
      end;
    end;procedure TMainForm.UnregisterIcon;
    begin
      Shell_NotifyIcon(NIM_DELETE, @FIconData);
    end;
    procedure TMainForm.WndProc(var Message: TMessage);
    begin
      if Message.Msg = FTaskMessage then
      begin
        RegisterIcon;
        Refresh;
      end;
      inherited WndProc(Message);
    end;procedure TMainForm.WMTrayIcon(var Message: TMessage);
    var
      Point: TPoint;
    begin
      case Message.LParam of
        WM_LBUTTONDBLCLK:
        begin
          // dblclick 图标时作的事
        end;
        WM_RBUTTONDOWN:
        begin
          // 右键时弹出Popupmenu, 记得放一个哈
          GetCursorPos(Point);
          SetForegroundWindow(Handle);
          PopupMenu.Popup(Point.x, Point.y);
        end;
      end;
    end;
      

  2.   

    楼上的高手,能不能给你调试好的代码呀,上面的     S1: TMenuItem;
        Setup: TAction;
        N1: TMenuItem;
        S2: TMenuItem;
    以上怎么都没有对用的动作或文件
    Shutdown: TAction;
        Properties: TAction;
    以上两个在编译时提示要求移走。implementationuses Setting;
    这个setting单元没有代码
    我是个新手,请楼上高手给个完整的demo(自己调试过的代码打包也可以,)高分结帖!