| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 552 人关注过本帖
标题:关于防止程序重复运行并恢复原窗口的故障,请老师指教!
只看楼主 加入收藏
kongxc
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:60
专家分:104
注 册:2007-9-30
结帖率:83.33%
收藏
已结贴  问题点数:20 回复次数:7 
关于防止程序重复运行并恢复原窗口的故障,请老师指教!
我按liuxingang28老师的方法使用:(为了能显示原窗体)
# DEFINE SW_NORMAL 1    && 窗口状态:正常大小
# DEFINE SW_MAXIMIZE 3  && 窗口状态:最大化

DECLARE integer FindWindow IN WIN32API integer,string    && 获取应用程序窗口句柄
DECLARE integer ShowWindow IN WIN32API integer,integer   && 显示应用程序窗口
DECLARE integer IsZoomed IN WIN32API integer             && 判断窗口是否最大化

cTitle = '物料管理系统'                   && 应用程序标题
nHwnd = FindWindow(0,cTitle)              && 获取窗口句柄
IF nHwnd > 0                              && 应用程序已启动
    IF IsZoomed(nHwnd) = 1                && 原窗口的状态是最大化
        ShowWindow(nHwnd,SW_MAXIMIZE)     && 激活原窗口,并保持最大化
    ELSE
        ShowWindow(nHwnd,SW_NORMAL)       && 原窗口是隐藏或最小化状态,则激活原窗口,并保持正常大小
    ENDIF
    QUIT                                  && 退出本次应用程序
ENDIF
测试结果是虽然显示了窗口,但它是个透明的窗体,上面的全部控件都看不见,所以无法使用.
然后我在表单的窗口激活事件中加入了表单和控件的全部Refresh,也没有起到任何作用.
还请老师们多多指教....
搜索更多相关主题的帖子: 物料管理 应用程序 
2014-05-09 15:23
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
我的代码是测试过的,不过当时是在 VFP 环境下对“记事本”窗口和“计算器”窗口进行的测试。现在,我对 VFP 应用程序窗口再测一下……

泉城飞狐
2014-05-09 15:38
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:20 
经过测试,我的代码在 Windows XP 下运行未遇到你说的问题,不过有一点 Bug,现修正如下:
程序代码:
# DEFINE SW_NORMAL 1    && 窗口状态:正常大小
# DEFINE SW_MAXIMIZE 3  && 窗口状态:最大化

DECLARE integer FindWindow IN WIN32API integer,string    && 获取应用程序窗口句柄
DECLARE integer ShowWindow IN WIN32API integer,integer   && 显示应用程序窗口
DECLARE integer IsZoomed IN WIN32API integer             && 判断窗口是否最大化
DECLARE integer SetForegroundWindow IN WIN32API integer

cTitle = '物料管理系统'                   && 应用程序标题
nHwnd = FindWindow(0,cTitle)              && 获取窗口句柄
IF nHwnd > 0                              && 应用程序已启动
    SetForegroundWindow(nHwnd)
    IF IsZoomed(nHwnd) = 1                && 原窗口的状态是最大化
        ShowWindow(nHwnd,SW_MAXIMIZE)     && 激活原窗口,并保持最大化
    ELSE
        ShowWindow(nHwnd,SW_NORMAL)       && 原窗口是隐藏或最小化状态,则激活原窗口,并保持正常大小
    ENDIF
    QUIT                                  && 退出本次应用程序
ENDIF
以上代码增加了两行,其中一行是 DECLARE integer SetForegroundWindow IN WIN32API integer,定义了一个设置活动窗口的 API 函数,另一行语句是 SetForegroundWindow(nHwnd),先将原应用程序窗口设定到前台,然后再恢复大小。
不知道楼主的操作系统是 XP 还是 Win7,我仅在 XP 下测试通过。

泉城飞狐
2014-05-09 16:08
qingfameng
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:35
帖 子:964
专家分:3019
注 册:2010-2-6
收藏
得分:0 
.  .

[ 本帖最后由 qingfameng 于 2014-5-10 07:23 编辑 ]
2014-05-10 01:25
kongxc
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:60
专家分:104
注 册:2007-9-30
收藏
得分:0 
虽然不成功,可能是显示窗体的环境原因,我用的是XP的SP3,关键是我表单是顶层表单,_screen.visible=.f.,又使用了内存驻留,各种异线显示方法都无法将窗体的Visible=.T.,因为我的驻留图标激活时的条件设的是:if mainfrm.visible=.f.才显示窗体,结果虽然可看见窗体标题和轮廓,但此时只有点击该图标才可完整显示窗体.图标显示窗体的过程是: windowstart=0 mainfrm.visible=.t. mainfrm.show 就是这三句能正常显示窗体.这个类也是在这论坛里找到的...
2014-05-12 15:28
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
你的问题,我已经完全解决。请修改表单 MainFrm 中“隐藏窗口”按钮的代码,去掉“THISFORM.Hide()”,添加“ShowWindow(THISFORM.HWnd,0)”即可。当然,需要在主程序 main.prg 中恢复 ShowWindow() API函数的定义,以及在 CheckWin 函数中恢复 ShowWindow(nHwnd,1) 语句。

泉城飞狐
2014-05-14 16:58
kongxc
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:60
专家分:104
注 册:2007-9-30
收藏
得分:0 
谢谢,已成功完美解决.
2014-05-15 16:16
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
只启动一个实例不行吗

DO IT YOURSELF !
2014-05-15 16:24
快速回复:关于防止程序重复运行并恢复原窗口的故障,请老师指教!
数据加载中...
 
   



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

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