如题,网上找的都有问题,用不了~~~(我的是Delphi 7版本,最好有注释的)
解决方案 »
- TSocketConnection 10054
- 求助:如何把<a href="http://www.sohu.com" target="_blank">按钮 </a> 连接到iwtraweb的控件使之打开新窗口
- 有没用过dsoframer.ocx的大侠,偶怎么一用就报错,说什么变量类型错误!!!!!
- 调用Oracle存储过程
- 如何注册服务?
- 用sql语句怎么查询?菜鸟问题30分
- 有关form释放问题?
- 在一个程序里控制另一个程序最大化和最小化的问题?
- 请问模式窗体和非模式窗体什么意思?
- TQuery 返回的结果集不能 edit?? why??
- DELPHI中升级数据库
- 关于mapx 坐标系设置的问题
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, CoolTrayIcon;
type
TForm1 = class(TForm)
btn1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
public
HotKeyId: Integer;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
if Msg.HotKey = HotKeyId then
begin
ShowWindow(Application.Handle, SW_RESTORE);
SetForegroundWindow(Application.Handle);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
HotKeyId := GlobalAddAtom(PChar('F2'));
RegisterHotKey(Handle,HotKeyId,0,VK_F2);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(handle,HotKeyId);
GlobalDeleteAtom(HotKeyId);
end;
end.
{OR}
{用到3个API函数:}
BOOL RegisterHotKey(
HWND hWnd, //响应该热键的窗口句柄
Int id, //该热键的唯一标识
UINT fsModifiers, //该热键的辅助按键
UINT vk //该热键的键值
);
{
为了得到唯一标识,我们还将用到另一个API函数}
ATOM GlobalAddAtom(
LPCTSTR lpString //自己设定的一个字符串
);
{
因为我们还要在程序退出的时候,消除这个热键, 所以需要声明一个全局变量:}
HotKeyId: Integer;
{
第一步:
在窗口的create事件中,加入以下代码
}
HotKeyId := GlobalAddAtom('MyHotKey') - $C000;
{注: HotKeyId的合法取之范围是0x0000到0xBFFF之间, GlobalAddAtom函数得到的值在0xC000到0xFFFF之间,所以减掉0xC000来满足调用要求。
第二步:
在上面的代码下面加入:
}
RegisterHotKey(Handle, hotkeyid, MOD_ALT, VK_F8);
{
热键的辅助按键包括Mod_Ctrl 、Mod_Alt、Mod_Shift,对于Windows兼容键盘还支持Windows
键,即其键面上有Windows标志的那个键,其值为Mod_win。
上面 的代码注册了一个热键:ALT+F8。当然如果你希望象TAKEIT那样,只用F8, 就这么写:}
RegisterHotKey(Handle, hotkeyid, 0, VK_F8);
{
注:handle是一个特殊的变量,它表示当前窗口的句柄。
这个函数你应该能句举一反三了吧。
原理:
一旦热键设置成功,在程序应用过程中如果有相应的键被按下,Windows系统都会给你的应
用程序发送一个消息WM_HOTKEY,不管你的应用程序是否为当前活动的。其中WM_HOTKEY消
息的格式为:
}
idHotKey = (int) wParam; // 该参数在设置系统级的热键有用,一般不予使用
fuModifiers = (UINT) LOWORD(lParam); //热键的辅助按键
uVirtKey = (UINT) HIWORD(lParam); //热键的键值
{
第三步:
响应代码
首先,在程序头部分的private段中加入声明 (作用是声明这个过程,和声明变量类似。
关于如何声明函数、过程,请请参考各自的帮助文件或其它资料):
}
procedure HotKeyDown(var Msg: Tmessage); message WM_HOTKEY;
{
然后在程序中加入如下代码:
}
procedure Tfmain.HotKeyDown(var Msg: Tmessage);
begin
if (Msg.LparamLo = MOD_ALT) AND (Msg.LParamHi = VK_F8 then) // 假设热键为ALT+F8
begin
ShowMessage('F8');
end;
end;
{
最后一步:
在窗口的close事件中加入
}
UnRegisterHotKey(handle, HotKeyId); //注销HotKey, 释放资源。
atomid = GlobalAddAtom(ls_atomid)
//得到ID,保证不和其他应用程序发生冲突
ll_RC = RegisterHotKey(Handle(this), atomid, MOD_ALT + MOD_CONTROL, 65)
//注册的热键为Ctrl+Alt+A ,65为'A'
{
声明函数和类型
}
private
hotkeyid :integer;
procedure WMhotkeyhandle(var msg:Tmessage); message wm_hotkey; //最小化或者隐藏程序响应热键
{
注册热键
}
hotkeyid:=GlobalAddAtom(pchar('UserDefineHotKey'))-$C000; //取值范围
registerhotkey(handle,hotkeyid,mod_Alt,90);//注册热键
if (msg.LParamHi=90) and(msg.lparamLo=mod_Alt) then //相应代码
form1.Show;/显示窗体
//注销热键
unregisterhotkey(handle,hotkeyid);
DeleteAtom(HotKeyID);
这个很简单,应该没问题
TForm1 = class(TForm)
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
aatom:atom;
procedure hotkey(var msg:tmessage);message wm_hotkey; //定义全局热键消息事件
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
aatom:=globaladdatom('hotkey'); //全局热键ID
RegisterHotKey(handle,aatom,MOD_ALT,vk_f12); //注册全局热键
end;
procedure TForm1.hotkey(var msg:tmessage); //热键响应事件
begin
if (msg.LParamHi=VK_F12) and (msg.LParamLo=MOD_ALT) then //全局热键 ALT+F12
ShowWindow(Application.Handle, SW_RESTORE); //当目标窗口没有最小化而是层叠在后台时无效,只能用于显示隐藏或最小化的窗体
SetForegroundWindow(form1.handle); //当目标窗体最小化后此句无效,只能改变窗体z序列前后位置 end;
//note:以上两个API合用时才能达到随时激活隐藏窗体的效果procedure TForm1.FormDestroy(Sender: TObject); //销毁全局热键
begin
globalDeleteatom(aatom);
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
protected
procedure hotykey(var msg:TMessage); message WM_HOTKEY;
private
//procedure WndProc(var Message: TMessage); override;
public
{ Public declarations }
end;var
Form1: TForm1;
hotkey_F1: integer;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
hotkey_F1 :=GlobalAddAtom('hotkey1');
RegisterHotKey(handle, HotKey_F1, 0, vk_F1); //F1
end;procedure TForm1.FormShow(Sender: TObject);
begin
hotkey_F1 :=GlobalAddAtom('hotkey1');
RegisterHotKey(handle, HotKey_F1, 0, vk_F1); //F1
end;procedure TForm1.Button1Click(Sender: TObject);
begin
hotkey_F1 :=GlobalAddAtom('hotkey1');
RegisterHotKey(handle, HotKey_F1, 0, vk_F1); //F1
end;procedure TForm1.hotykey(var msg:TMessage);
begin
if (msg.LParamHi=vk_F1) then showmessage('Ctrl + Q ');
end; {
procedure TForm1.WndProc(var Message: TMessage);
begin
Inherited;
if Message.LParamHi=vk_F1 then showmessage('F1被按下');
end; }procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(handle, HotKey_F1); //F1
end;
end.