| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4233 人关注过本帖
标题:系统环境下如何判断VFP表单窗口处于激活状态?
只看楼主 加入收藏
w7802672
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2015-5-20
收藏
得分:0 
回复 8楼 吹水佬
不好意思,我想再问一下,可否利用TIMER控件使当前活动窗口由PPT再回到VFP呢?
我在VFP表单的TIMER控件中加入了
DECLARE Long SetActiveWindow IN WIN32API Long hWnd
SetActiveWindow( thisform.HWnd )
计时时间到了以后虽然执行了上述命令,窗口标题也显示为“窗口获得焦点”了,但实际上这个VFP窗口并没有被激活,键盘上的操作仍然是对PPT进行操作的。什么样的命令可以使VFP再次变成真正的活动窗口呢?
2017-08-18 12:07
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 

试试在Form1.ActiVate事件中加入
DECLARE Long SetActiveWindow IN WIN32API Long hWnd
SetActiveWindow( thisform.HWnd )

坚守VFP最后的阵地
2017-08-18 12:12
w7802672
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2015-5-20
收藏
得分:0 
回复 12楼 sdta
放在表单的ACTIVATE中也不行,窗口的标题是变了,变成了“窗口获取焦点”了,只是没有真正地被激活,PPT仍然是当前的活动窗口。好象只有用鼠标点窗口才能真正地被激活。
2017-08-18 12:21
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
这个问题可能与窗口Z序列和键盘焦点有关
下午有空再试试
2017-08-18 12:34
w7802672
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2015-5-20
收藏
得分:0 
回复 14楼 吹水佬
谢谢您!非常感谢,如果有什么好的方法还望及时赐教!
2017-08-18 12:40
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
SetActiveWindow()只适用在前台同一线程消息队列不同窗口之间调度。
SetForegroundWindow()可激活一个窗口并将其强制为前台窗口。

** test.prg
#define WM_SETFOCUS         7
#define WM_KILLFOCUS        8
#define SW_SHOWNORMAL       1
#define SWP_NOSIZE          1
#define SWP_NOMOVE          2
#define HWND_TOPMOST        -1
#define HWND_NOTOPMOST      -2
#define MY_SETFOREGROUND    0x401
DECLARE LONG SendMessage IN User32 LONG, LONG, LONG, LONG
DECLARE LONG PostMessage IN User32 LONG, LONG, LONG, LONG
DECLARE LONG GetForegroundWindow IN user32
DECLARE LONG GetCurrentThreadId IN kernel32
DECLARE LONG GetWindowThreadProcessId IN user32 LONG, LONG
DECLARE LONG AttachThreadInput IN user32 LONG, LONG, LONG
DECLARE LONG ShowWindow IN user32 LONG, LONG
DECLARE LONG SetWindowPos IN user32 LONG, LONG, LONG, LONG, LONG, LONG, LONG
DECLARE LONG SetForegroundWindow IN user32 LONG
_SCREEN.Visible = .F.
of = CREATEOBJECT("myForm")
of.show
READ EVENTS
RETURN

DEFINE CLASS myForm As Form
    Desktop = .T.
    ShowWindow = 2
    ADD OBJECT timer1 as timer WITH Interval=10000,Enabled=.F.
    ADD OBJECT text1 as textbox WITH top=10,left=10

    PROCEDURE Unload
        CLEAR EVENTS
    ENDPROC

    PROCEDURE Init
        BINDEVENT(this.hWnd, WM_SETFOCUS, this, "_SetFocus")
        BINDEVENT(this.hWnd, WM_KILLFOCUS, this, "_KillFocus")
        BINDEVENT(this.hWnd, MY_SETFOREGROUND, this, "_SetForeground")
    ENDPROC

    PROCEDURE Destroy
        UNBINDEVENTS(this.hWnd)
    ENDPROC

    PROCEDURE timer1.timer
        this.Enabled = .F.
        PostMessage(thisform.hWnd, MY_SETFOREGROUND, 0, 0)
    ENDPROC

    FUNCTION _SetFocus(hWnd, nMsg, wParam, lParam)
        this.Caption = "窗口获得焦点"
        SendMessage(hWnd, nMsg, wParam, lParam)
    ENDFUNC

    FUNCTION _KillFocus(hWnd, nMsg, wParam, lParam)
        this.Caption = "窗口失去焦点,10秒后自动获得焦点"
        this.timer1.Enabled = .T.
        SendMessage(hWnd, nMsg, wParam, lParam)
    ENDFUNC
   
    FUNCTION _SetForeground(hWnd, nMsg, wParam, lParam)
        LOCAL hForeWnd, dwCurID, dwForeID
        *INKEY(0.1)    && 这时要加延时?
        hForeWnd = GetForegroundWindow()
        dwCurID  = GetCurrentThreadId()
        dwForeID = GetWindowThreadProcessId(hForeWnd, 0)
        AttachThreadInput(dwCurID, dwForeID, .T.)    && 切换键盘输入焦点
        ShowWindow(hWnd, SW_SHOWNORMAL)              && 显示窗口(有时窗口被最小化/隐藏了)
        SetWindowPos(hWnd, HWND_TOPMOST,0,0,0,0,SWP_NOSIZE+SWP_NOMOVE)   && 更改窗口的Z序列使之最上
        SetWindowPos(hWnd, HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE+SWP_NOMOVE) && 为了不影响后续窗口的Z序列,改完之后还原
        SetForegroundWindow(hWnd)
        AttachThreadInput(dwCurID, dwForeID, .F.)   
    ENDFUNC
ENDDEFINE
2017-08-18 15:49
w7802672
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2015-5-20
收藏
得分:0 
回复 16楼 吹水佬
实在不好意思,很长时间没有登录论坛了,我刚看到,真的非常感谢,您太好了!
2017-08-30 14:56
w7802672
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2015-5-20
收藏
得分:0 
回复 16楼 吹水佬
chform.rar (2.95 KB)


恳请您帮我看一下哪里有问题。您的代码在运行时完成可以,效果就是我想要的效果,但我将代码改用到表单上时有点不太会用,运行时总出错,麻烦您修改一下,非常感谢!
2017-09-02 11:27
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用w7802672在2017-9-2 11:27:25的发言:



恳请您帮我看一下哪里有问题。您的代码在运行时完成可以,效果就是我想要的效果,但我将代码改用到表单上时有点不太会用,运行时总出错,麻烦您修改一下,非常感谢!

1、将表单init事件中用#define定义的常量放到一个头文件里,如:
    ** chform.h
    #define WM_SETFOCUS         7
    #define WM_KILLFOCUS        8
    #define SW_SHOWNORMAL       1
    #define SWP_NOSIZE          1
    #define SWP_NOMOVE          2
    #define HWND_TOPMOST        -1
    #define HWND_NOTOPMOST      -2
    #define MY_SETFOREGROUND    0x401
2、设计表单时,在VFP菜单--表单--包含文件,选择chform.h文件。
chform.rar (3.85 KB)
2017-09-02 11:58
w7802672
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2015-5-20
收藏
得分:0 
回复 19楼 吹水佬
太好了,真的是太感谢了!
2017-09-02 12:24
快速回复:系统环境下如何判断VFP表单窗口处于激活状态?
数据加载中...
 
   



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

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