绝对是被别的程序占用了。我依稀记得有一个常用的工具用了这个,但记不清了。楼主检查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
找到原因了: 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
首先 非常感谢 大家。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
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
原来如此。我是菜鸟。那是否说明,在 delphi中,或者说在有kernel-mode debugger or a just-in-time debugger is resident的环境下,是无法RegisterHotKey 设置F12的。谢谢您,高人。
你的水平 也许 很高。
但是你的素质 肯定 一般!
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
就是不允许注册F12。--
http://www.agui.googlepages.com
mailto: agui.cn(a)gmail.com
模块中的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=====================
这个人 水平挺高的,不知道 有办法吗???
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