| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1352 人关注过本帖, 1 人收藏
标题:对任何与 ALT键的组合键,不发生keypress 事件?
只看楼主 加入收藏
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
试了真的不错,谢了。
2011-10-17 19:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你猜猜这是什么原因?

授人以渔,不授人以鱼。
2011-10-17 20:28
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
CLEAR ALL
CLOSE DATABASES ALL
CLEAR 

goForm = CREATEOBJECT("C_Form")
goForm.Show
READ EVENTS

CLOSE DATABASES ALL
CLEAR ALL
RETURN 

DEFINE CLASS C_Form AS Form
    Caption = "测试例程"
    MinWidth = 800
    MinHeight = 600
    AutoCenter = .T.
    KeyPreview = .T.
    ShowWindow = 2            && 注意:某些功能键在ShowWindow=0下是检测不到的
   
    ADD OBJECT Edit1  AS EditBox
    ADD OBJECT Label1 AS Label WITH Caption = "", Height = 25, AutoSize = .T.
   
    PROCEDURE Arrange
        WITH ThisForm.Label1
            .Top = ThisForm.Height - .Height - 5
            .Left = 5
        ENDWITH
        WITH ThisForm.Edit1
            .Top = 5
            .Left = 5
            .Height = ThisForm.Label1.Top - .Top - 5
            .Width = ThisForm.Width - .Left - 5
        ENDWITH
    ENDPROC
   
    PROCEDURE Activate
        ThisForm.Arrange
    ENDPROC
   
    PROCEDURE Resize
        ThisForm.Arrange
    ENDPROC
   
    PROCEDURE KeyPress(tnKeyCode, tnShiftAltCtrl)
        IF tnKeyCode != 0x1B
            ThisForm.Label1.Caption = "所按键码:KeyCode = " + ALLTRIM(STR(tnKeyCode)) + "  ShiftAltCtrl = " + ALLTRIM(STR(tnShiftAltCtrl))
        ELSE
            RELEASE ThisForm
        ENDIF
    ENDPROC
   
    PROCEDURE Destroy
        CLEAR EVENTS
    ENDPROC
   
ENDDEFINE
收到的鲜花
  • qjbzjp2011-10-18 17:36 送鲜花  20朵   附言:我很赞同

授人以渔,不授人以鱼。
2011-10-17 23:20
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
不知何原因?
tnKeyCode != 0x1B表示什么?
您用代码书写类真是到了出神如化的地步了。佩服。
2011-10-18 10:36
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
0x1B是16进制的数字(即10进制27,是Esc键的ASCII码)写法。

授人以渔,不授人以鱼。
2011-10-18 11:39
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
如果要检测带Alt的组合键,不能用Keypress事件触发,可以改用INKEY()函数。

授人以渔,不授人以鱼。
2011-10-18 16:05
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
VFP的控件,据观察其实用Windows API调用系统控件的,标准控件如Form、TextBox、ListBox、MessageBox()、GetFile()、GetDir()等尤其如此。在Windows窗体中,用Alt键启动窗体菜单(用鼠标左击窗体左上角的角落图标就可调出一个菜单),而且很多固有的功能也是用Alt组合键启动的,比如Alt+F4是关闭窗体的快捷键。所以,在依赖这种控件的应用程序中,按下Alt组合键的时候,首先被Windows截获,它判断自己是否应该处理(比如你按了Alt+F4,Windows不用经你同意就可以关闭这个程序的),这一类的按键,等于被Windows没收了,所以它是不可能传到控件内部的,恐怕这就是VFP设计的标准控件都屏蔽掉Alt组合键的原因。

在VFP的_SCREEN窗口下,F10键是启用VFP系统菜单的(与单按Alt键等效,故两者的键码均为-9)。用上面的程序,改ShowWindow=0,就可以发现按F10键没反应,而在ShowWindow=2下是可以的。这个现象说明,屏蔽Alt组合键,也是同样的道理。事实上,用INKEY()函数就可以检测到Alt+F2,但Alt+F1则不行,因为这个键VFP有特殊用途。也就是说,底层的程序拦截了自己有用的,没用的才给上层的应用程序。

授人以渔,不授人以鱼。
2011-10-18 16:44
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
谢谢。
2011-10-19 08:05
快速回复:对任何与 ALT键的组合键,不发生keypress 事件?
数据加载中...
 
   



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

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