| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3090 人关注过本帖
标题:程序运行后托盘图标显示,窗体隐藏后,第二次打开程序无法显示激活窗口
只看楼主 加入收藏
rogersgb
Rank: 1
等 级:新手上路
帖 子:73
专家分:0
注 册:2016-2-3
结帖率:47.37%
收藏
 问题点数:0 回复次数:2 
程序运行后托盘图标显示,窗体隐藏后,第二次打开程序无法显示激活窗口
我做了一个.只运行一次程序带托盘的.但当收缩到托盘时.再运行程序不能激活窗体
请大家帮忙
单元代码如下
unit wdRunOnce;

{*******************************************
 * brief: 让程序只运行一次
 * autor: linzhenqun
 * date: 2005-12-28
 * email: linzhengqun@
 * blog: http://blog.
********************************************}

interface

(* 程序是否已经运行,如果运行则激活它 *)
function AppHasRun(AppHandle: THandle): Boolean;


implementation
uses
  Windows, Messages;

const
  MapFileName = '{CAF49BBB-AF40-4FDE-8757-51D5AEB5BBBF}';

type
  //共享内存
  PShareMem = ^TShareMem;
  TShareMem = record
    AppHandle: THandle;  //保存程序的句柄
  end;

var
  hMapFile: THandle;
  PSMem: PShareMem;

procedure CreateMapFile;
begin
  hMapFile := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, PChar(MapFileName));
  if hMapFile = 0 then
  begin
    hMapFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,
      SizeOf(TShareMem), MapFileName);
    PSMem := MapViewOfFile(hMapFile, FILE_MAP_WRITE or FILE_MAP_READ, 0, 0, 0);
    if PSMem = nil then
    begin
      CloseHandle(hMapFile);
      Exit;
    end;
    PSMem^.AppHandle := 0;
  end
  else begin
    PSMem := MapViewOfFile(hMapFile, FILE_MAP_WRITE or FILE_MAP_READ, 0, 0, 0);
    if PSMem = nil then
    begin
      CloseHandle(hMapFile);
    end
  end;
end;

procedure FreeMapFile;
begin
  UnMapViewOfFile(PSMem);
  CloseHandle(hMapFile);
end;

function AppHasRun(AppHandle: THandle): Boolean;
var
  TopWindow: HWnd;
begin
  Result := False;
  if PSMem <> nil then
  begin
    if PSMem^.AppHandle <> 0 then
    begin
      SendMessage(PSMem^.AppHandle, WM_SYSCOMMAND, SC_RESTORE, 0);
      TopWindow := GetLastActivePopup(PSMem^.AppHandle);
      if (TopWindow <> 0) and (TopWindow <> PSMem^.AppHandle) and
        IsWindowVisible(TopWindow) and IsWindowEnabled(TopWindow) then
        SetForegroundWindow(TopWindow);
      Result := True;
    end
    else
      PSMem^.AppHandle := AppHandle;
  end;
end;

initialization
  CreateMapFile;

finalization
  FreeMapFile;

end.
搜索更多相关主题的帖子: 运行 显示 end begin then 
2017-09-16 12:38
lvts
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2017-11-29
收藏
得分:0 
用第三方控件多好
2017-11-29 17:11
SupermanTm
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2020-1-7
收藏
得分:0 
用共享映射文件来做这个直接就是杀鸡用大关刀了,好简单的方法
先给主窗口一个自定义的类名字,在给个函数用 FindWindow 看看找不找到这个窗口,若找不到,则允许自己启动,若找到,给这个窗口发个消息让它活动
unit ...
interface
type
  TMainForm = class(TForm)
  ...
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;
...
function AppCanStart: Boolean;

implementation
const
  MyWindowClassName = 'MyWindowsClassName2020-1';

procedure TMainForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WinClassName:= MyWindowClassName;
end;
function AppCanStart: Boolean;
var
  FWnd: HWND;
begin
  FWnd:= FindWindow(MyWindowClassName, nil);  
  if IsWindow(FWnd) then begin
    SetForeGroundWindow(FWnd);
    Result:= False;
  end else begin
    Result:= True;
  end;
end;

DPR 中:
begin
  if AppCanStart then begin
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
  end;
end.

2020-01-07 17:18
快速回复:程序运行后托盘图标显示,窗体隐藏后,第二次打开程序无法显示激活窗口 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016801 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved