zoukankan      html  css  js  c++  java
  • 关于创建无窗体程序的一点心得

    这2天在写一个工作统计的小东西, 设计思路是创建一个只有托盘图标的程序, 无主窗体, 唯一查看窗体都是动态创建关闭销毁的

    使用Delphi自带的TrayIcon控件在DataModule里创建托盘, 由于没有主窗体, 所以设置Application.MainFormOnTaskbar := False;

    在查看窗体显示后, 无论点关闭还是最小化都要求关闭窗体, 点击任务栏按钮也一样

    但是运行后检查实际效果发现, 任务栏按钮没有反应, 而显示出的窗体在点击最小化以后是缩小到桌面左下角

    经过一系列跟踪VCL发现(过程太复杂了懒得写了^_^), 原来是因为非主窗体, 所以消息都没有经过Application托管, 所以想要达到目的还需要自己处理消息

    改动如下:

    复制代码
    var
      nMSG: TMSG;
    begin
      Application.Initialize;
      ReportMemoryLeaksOnShutdown := True;
      Application.MainFormOnTaskbar := False;
      Application.CreateForm(TDM, DM);
      while GetMessage(nMSG, 0, 0, PM_NOREMOVE) do
      begin
        {在消息循环里处理关闭/最小化消息, 这个消息是任务栏按钮触发的}
        case nMSG.message of
          WM_SYSCOMMAND:
            case nMsg.wParam of
              SC_CLOSE, SC_MINIMIZE:
                DM.SetView(False);
            end;
        end;
        TranslateMessage(nMSG);
        DispatchMessage(nMSG);
      end;
      Application.Run;
    end.
    复制代码
    复制代码
      TFrmMain = class(TForm)
        ...
      private
        { Private declarations }
        {窗口里处理最小化按钮消息}
        procedure WMSYSCOMMAND(var msg: TMessage); message WM_SYSCOMMAND;
      public
        { Public declarations }
      end;
    
    
    procedure TFrmMain.WMSYSCOMMAND(var msg: TMessage);
    begin
      inherited;
      case msg.WParam of
        SC_MINIMIZE:
          Close;
      end;
    end;
    复制代码

    目前还有个问题没解决: 在点击了显示桌面以后窗体不能自动关闭NND 这个实在没啥思路, 监控了消息, 什么都没有, 看来是需要弄个API钩子了

    http://www.cnblogs.com/hs-kill/p/3345165.html

  • 相关阅读:
    chapter23:软件安装RPM,SRPM与YUM之(0)-软件管理器的简介
    chapter22:源码与Tarball之(3)-函数库的管理
    chapter22:源码与Tarball之(2)-Tarball的管理与安装
    Akamai在内容分发网络中的算法研究(翻译总结)
    常用机器性能评估工具
    利用神经网络编辑图片的调研
    Redis命令总结及其基础知识讲述
    MySQL主从复制与主主复制
    MySQL查询优化
    降低Redis内存占用
  • 原文地址:https://www.cnblogs.com/findumars/p/5812157.html
Copyright © 2011-2022 走看看