http://community.csdn.net/Expert/topic/5049/5049956.xml?temp=1.598758E-02谢谢。

解决方案 »

  1.   

    不是已经解决了吗?RegisterHotKey
      

  2.   

    DELPHI自带控键就有。还定义个P
      

  3.   

    DELPHI自带控键就有。还定义个P=========
    你的水平 也许 很高。
    但是你的素质 肯定 一般!
      

  4.   

    绝对是被别的程序占用了。我依稀记得有一个常用的工具用了这个,但记不清了。楼主检查RegisterHotKey调用结果的方法不正确,你应该直接检查它的返回值是不是true,而不是拿GetLastError跟1409比。应该这样:
      if not RegisterHotKey( Handle, id, 0, VK_F12 ) then
        ShowMessage( 'Failed to register hot key: ' + SysErrorMessage(GetLastError()) );
    在我机器上也失败,错误信息为:热键已注册。
    --
    http://www.agui.googlepages.com
    mailto: agui.cn(a)gmail.com
      

  5.   

    找到原因了: http://windowssdk.msdn.microsoft.com/en-us/library/ms646309.aspxWindows NT4 and Windows 2000/XP: The F12 key is reserved for use by the debugger at all times, so it should not be registered as a hot key. Even when you are not debugging an application, F12 is reserved in case a kernel-mode debugger or a just-in-time debugger is resident.
    就是不允许注册F12。--
    http://www.agui.googlepages.com
    mailto: agui.cn(a)gmail.com
      

  6.   

    首先 非常感谢 大家。agui 给的回答 好像是对的,但好像.....我原来用ACCESS VBA 做的一个程序,就定义了f12为快捷键,当在别的软件界面时,只要按下F12,我的程序(已经运行)自动切换到最前面。下面是 VBA的代码
    模块中的API如下:Option Compare Database
    Option ExplicitDeclare Function SendMessage Lib "user32" _
                                 Alias "SendMessageA" (ByVal hwnd As Long, _
                                                       ByVal wMsg As Long, ByVal wParam As Long, _
                                                       lParam As Long) As LongDeclare Function DefWindowProc Lib "user32" _
                                   Alias "DefWindowProcA" (ByVal hwnd As Long, _
                                                           ByVal wMsg As Long, ByVal wParam As Long, _
                                                           ByVal lParam As Long) As LongPublic Const WM_SETHOTKEY = &H32
    Public Const WM_SHOWWINDOW = &H18
    Public Const HK_SHIFTA = &H141    'Shift + A
    Public Const HK_SHIFTB = &H142    'Shift * B
    Public Const HK_CONTROLA = &H241    'Control + A
    Public Const HK_ALTZ = &H45A    'Alt+ Z
    Public Const HK_F12 = &H7B&    'F12 热键常量
    Form_Load事件中的代码如下    Dim erg As Long    erg = SendMessage(Me.hwnd, WM_SETHOTKEY, HK_F12, 0) 定义热键
        If erg <> 1 Then
            MsgBox "error", vbOKOnly, Appname
        End If    erg = DefWindowProc(Me.hwnd, WM_SHOWWINDOW, 0, 0) 按下 热键 显示 我的程序
        '------------------------------------------------我做的这个程序,已经运行了1年多了,在MS WIN 98 2000 2002 2003,OFFICE ACCESS 2000,2002,2003下运行都正常,在我遇到问题的安装有DELPHI 的机器上,也正常,我在写这个帖子时,特地测试了一下。这说明,f12键是可以定义成热键的。delphi下为何不行呢? 我猜 因为是 just-in-time debugger 的原因吧,用delphi写的代码,即使你是定义f12为热键,编译后,得到的程序没有将f12定义为热键,运行时,当然就不行了。我安装delphi时,首先看到一个提示,就是说你的机器上 just-in-time debugger 已经设置为别的程序,要用到DELPHI的某某调试功能,需要将DELPHI设置成 just-in-time debugger ,我当时选的是 是。不知道 是否和这个原因有关。所以,关键不在于机器上
    是否安装了DELPHI,
    是否有  just-in-time debugger or a kernel-mode debugger 只要是DELPHI开发的软件,就无法设置f12为热键,即使你代码写成f12为热键,编译后,自动失效。我用ACCESS VBA就可以定义f12为热键,估计VB6也可以。VBA,VB6都不是a kernel-mode debugger  or  just-in-time debugger 而delphi是 just-in-time debugger 。不知道是不是这个原因?虽然问题,没有彻底解决,但还是很高兴。====================
     Conquer20() ( ) 信誉:100    Blog  2006-10-6 17:04:34  得分: 0  
     
       
    DELPHI自带控键就有。还定义个P=====================
    这个人 水平挺高的,不知道 有办法吗???  
     
      

  7.   

    WM_SETHOTKEY 跟 RegisterHotKey 不是一回事。 RegisterHotKey可以响应热键做任何事。而WM_SETHOTKEY 只是激活窗口,你的程序是被动的。如果你只是激活窗口,你也可以用 WM_SETHOTKEY。如:    SendMessage( Self.Handle, WM_SETHOTKEY, VK_F12, 0 );
    MSDN:
    An application sends a WM_SETHOTKEY message to a window to associate a hot key with the window. When the user presses the hot key, the system activates the window. --
    http://www.agui.googlepages.com
    mailto: agui.cn(a)gmail.com
      

  8.   

    原来如此。我是菜鸟。那是否说明,在 delphi中,或者说在有kernel-mode debugger or a just-in-time debugger is resident的环境下,是无法RegisterHotKey 设置F12的。谢谢您,高人。