| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4194 人关注过本帖, 2 人收藏
标题:VFP 如何设定当前窗口是活动窗口?(有时候窗口在最前,但焦点在桌面上)
只看楼主 加入收藏
sdoger
Rank: 2
等 级:论坛游民
威 望:1
帖 子:27
专家分:12
注 册:2011-2-15
结帖率:0
收藏(2)
已结贴  问题点数:20 回复次数:13 
VFP 如何设定当前窗口是活动窗口?(有时候窗口在最前,但焦点在桌面上)
VFP如何设定当前窗口是活动窗口?(有时候窗口在最前,但焦点在桌面上)
自作了一个自动刷卡的程序,什么都是全自动的,但焦点有时会在后面,虽然显示的是当前的vfp主画面。

有什么办法 可以使当前画面一直是活动画面? 或者使用定时器,定时的设定vfp窗口为活动窗口?
搜索更多相关主题的帖子: 定时器 如何 
2014-06-27 09:20
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:4 
只能在定时器事件中调用 API 函数来解决:
定时器的 Timer 事件代码如下:
程序代码:
# 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
ENDIF
若要完美实现楼主所要的功能,还要做如下设置:如果刷卡表单是顶层表单,直接设置表单的 AlwaysOnTop = .t.;如果表单不是顶层表单,设置 _Screen.AlwaysOnTop = .t.。这样设置后,即使单击其他窗口,也可以将焦点返回到刷卡程序窗口。


[ 本帖最后由 liuxingang28 于 2014-6-27 10:15 编辑 ]

泉城飞狐
2014-06-27 10:14
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:4 
DECLARE LONG GetFocus IN user32
DECLARE LONG SetFocus IN user32 LONG
IF GetFocus() != thisform.hWnd
    SetFocus(thisform.hWnd)
ENDIF
2014-06-27 10:19
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
回复 3 楼 吹水佬
经测试,当激活其他窗口时,目标VFP窗口没有成为活动窗口,并且当最小化窗口时,窗口也没有还原。不知 3 楼的朋友是否测试过?

泉城飞狐
2014-06-27 14:46
ktliaobo
Rank: 2
等 级:论坛游民
帖 子:27
专家分:17
注 册:2014-1-12
收藏
得分:4 
ACTIVATE WINDOW 窗口名称 &&激活窗口
窗口名称.Refresh    &&刷新窗口
2014-06-27 18:57
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
回复 4 楼 liuxingang28
确实不只是获取焦点那么简单,在表单拦截失去焦点消息WM_KILLFOCUS的事件中,试过如下方法:
SetFocus
SetForegroundWindow
BringWindowToTop
SwitchToThisWindow
表单就算能获取焦点,也不能切换到前台和获得键盘输入焦点?
2014-06-27 22:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:4 
如果这都不当是病毒或恶意程序,算你好运。

授人以渔,不授人以鱼。
2014-06-27 23:50
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
这类程序,本应运行在单任务的实时操作系统上,在多任务的分时系统上强行做这种功能,是侵占了操作系统的调度权,哪有让你个别进程长霸前台之理,你都做了操作系统的工作,不杀你杀谁。

授人以渔,不授人以鱼。
2014-06-27 23:56
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:4 
以下是引用TonyDeng在2014-6-27 23:56:45的发言:

这类程序,本应运行在单任务的实时操作系统上,在多任务的分时系统上强行做这种功能,是侵占了操作系统的调度权,哪有让你个别进程长霸前台之理,你都做了操作系统的工作,不杀你杀谁。
言之有理
2014-06-28 06:11
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
可能与线程调度有关,在Win8.1下测试那几个API的调用无效,也可能用法不当。
那就顺其自然用鼠标去点激活(当然不是用手去操作)
2014-06-28 09:04
快速回复:VFP 如何设定当前窗口是活动窗口?(有时候窗口在最前,但焦点在桌面上 ...
数据加载中...
 
   



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

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