您的位置:程序门 -> delphi -> 语言基础/算法/系统设计



只让程序运行一个实例,如何实现已经运行的实例获得焦点并正常显示 ?


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


只让程序运行一个实例,如何实现已经运行的实例获得焦点并正常显示 ?[已结贴,结贴人:swlove]
发表于:2007-09-20 01:13:53 楼主
已经实现只让程序运行一个实例,但我想再次双击这程序时能正常显示该程序

在下代码中,发送showwindow(ihandle,sw_showmaximized),这可以再次显示程序,但这是最大化显示,我想实现的是正常显示

而且我试过其他参数,如sw_normal   之类的都不行

请问要如何修改才能实现我的要求呢   ?   谢谢

program   project1;

uses
    forms,windows,
    unit1   in   'unit1.pas'   {form1};

{$r   *.res}
const
    iatom='myapplication';
var
    ihandle:thandle;
begin
    if   globalfindatom(iatom)=0   then
    begin
        globaladdatom(iatom);
        application.initialize;
        application.createform(tform1,   form1);
        application.run;
        globaldeleteatom(globalfindatom(iatom));
    end
    else   if   application.messagebox('程序已经在运行!   ','提示',mb_yesno+mb_iconasterisk)=idyes   then
        begin
            ihandle:=findwindow(nil,'form1');
            if   ihandle   <>   0   then
                showwindow(ihandle,sw_showmaximized);
        end;
end.
发表于:2007-09-20 01:38:451楼 得分:0
我想实现的是类似   声音控制软件   volumeeasy   那样的效果
发表于:2007-09-20 08:15:572楼 得分:0
其实可以使用   mutex   实现单一实例,然后通过共享内存存放application.handle   和   mainform.handle,另外一个进程启动时判断是否已经加载,若加载则读取application.handle   和   mainform.handle,然后显示即可。
发表于:2007-09-20 10:37:293楼 得分:0
to   keyee  

能否详细说说   ?

在大富翁那有人给我这答案http://www.delphibbs.com/delphibbs/dispq.asp?lid=3835806

可编译通过不了
发表于:2007-09-20 11:18:454楼 得分:0
哈,可以了

在我代码的基础上,找到句柄后,setforegroundwindow(ihandle);  
发表于:2007-09-20 21:57:025楼 得分:0
突然发现一个问题就是:

如果生成的程序名和窗体标题一样,那么隐藏的程序就不能正常显示
发表于:2007-09-21 08:15:366楼 得分:0
所以使用共享内存安全保险,如果别人做的程序名和窗体标题跟你一样不就完了?
发表于:2007-09-24 14:58:037楼 得分:20
看我的:
发表于:2007-09-26 01:53:308楼 得分:0
后运行的程序给先运行的程序发消息,   让它弹到最前,   并设置焦点控件


快速检索

最新资讯
热门点击