●●◎怎么截获某个键?100分◎●●
我想做一个程序,运行之后用来截F1键,然后调用运行一个外部EXE文件,并想把这个程序的图标缩在任务栏的右边的区域。
请大哥们帮帮我!
问题点数:100、回复次数:13Top
1 楼pzoon(杀死日本人)回复于 2003-12-03 21:46:53 得分 0
UP
DEMO里有一个获取图标的,但是你的截获里面没有了,你找一找,很多帖子有Top
2 楼codecb(阿星)回复于 2003-12-03 22:13:11 得分 0
可以注册个热键
注册热键方法可以搜索下Top
3 楼huoniao1976(火鸟1976)回复于 2003-12-04 08:45:35 得分 0
Form1->KeyPreview = true;
在自己定义消息,把图标加到系统托盘中
Top
4 楼huoniao1976(火鸟1976)回复于 2003-12-04 08:46:38 得分 0
Form1->KeyPreview = true;
switch(Key){
case VK_F1:
...Top
5 楼goneaway1981(当我们踏上征程)回复于 2003-12-04 09:16:15 得分 0
同意楼上Top
6 楼yunuo2010000(允诺)回复于 2003-12-04 14:18:27 得分 0
Form1->KeyPreview = true;
在窗体的OnKeyDown事件下写
if (Key=112)
Key=0; //如果键值为F1则屏蔽该键值。Top
7 楼bcbsoft(苍之雪)回复于 2003-12-04 17:54:12 得分 70
Form1->KeyPreview = true;
这种方法不行!
//---------------------------
.h 中这样做:
private: // User declarations
void __fastcall OnHotKey(TMessage& Msg);
public: // User declarations
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_HOTKEY, TMessage, OnHotKey)
END_MESSAGE_MAP(TForm)
//------------------------------------------
.CPP中
void __fastcall TmainForm::OnHotKey(TMessage& Msg)
{
做你要做的事
}
//------------------------------------------------------------------
void __fastcall TmainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
UnregisterHotKey(Handle, 2000);
}
void __fastcall TmainForm::FormCreate(TObject *Sender)
{
RegisterHotKey(Handle, 2000, 0, VK_F1); //F1 是热键
}
//---------------------------------------
在主窗体里放上一个TrayIcon,程序在运行时就可以在任务栏的托盘里了,如果要用鼠标弹出菜单,在主窗体中放上PopupMenu,把TrayIcon中的PopupMenu设置为刚才那个PopupMenu。
Top
8 楼zihan(子寒)回复于 2003-12-04 18:03:47 得分 0
注册热键是一个好的办法,但是要考虑到有可能你这个热键已经被人家的程序注册。
除了楼上的方法以外,你还可以采用键盘钩子的方法实现,如果检查到是F1,就进行操作。Top
9 楼Santos(快乐的GG)回复于 2003-12-04 18:31:35 得分 0
你其实是两个问题:
1、按键捕捉
2、系统托盘
解决:
1、Form1->KeyPreview = true;
Form1::OnKeyUp事件中
if(key == VK_F1)
... //调用外部程序
2、使用TrayIcon类可以非常简单解决。Top
10 楼aliker(吹口琴的猫)回复于 2003-12-04 19:43:41 得分 0
用键盘或日子钩子Top
11 楼yjy1001(蓝鲸--优秀得郁闷的鱼)回复于 2003-12-04 19:51:07 得分 30
注册热键的方法 bcbsoft(苍之雪) 已经说了
刚好 小弟今天写了一个全局的 键盘钩子,就发出来 给大家分享下吧。
DLL 文件
//---------------------------------------------------------------------------
#pragma option -zRShareSEG // 改变缺省数据段名
#pragma option -zTShareCLASS // 改变缺省数据类名
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#pragma argsused
#pragma data_seg("SharedVar")
#pragma data_seg()
HHOOK NewHook=NULL; // 存放新钩子句柄
HINSTANCE DllHinst;
KBDLLHOOKSTRUCT *pkbhs;
char keyWord;
__declspec(dllexport) LRESULT CALLBACK KeyHook(int code, WPARAM wParam, LPARAM lParam);
extern "C" __declspec(dllexport) int __stdcall GetKey(char &key,int &num);
extern "C" __declspec(dllexport) int __stdcall EnableHook(bool flag); //导出函数EnableHook()
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
DllHinst=hinst;
if (reason==DLL_PROCESS_ATTACH) // DLL入口
{
LoadCount+=1; // 装入计数
}
else
{
if (reason==DLL_PROCESS_DETACH) // DLL出口处理
{
LoadCount-=1;
}
}
return 1;
}
//---------------------------------------------------------------------------
//键盘钩子 回送 键盘键虚拟码
LRESULT CALLBACK KeyHook(int code, WPARAM wParam, LPARAM lParam)
{
EVENTMSG *keyMSG=(EVENTMSG *)lParam;
if(keyMSG->message==WM_KEYUP)
{
keyWord = (char)(keyMSG->paramL); //回送 键盘键虚拟码
DownCount++;
}
return CallNextHookEx(NewHook,
code, wParam, lParam);
}
//---------------------------------------------------------------------------
int __stdcall GetKey(char &key,int &num) // DLL导出函数GetKey()
{
key = keyWord; // 送出键盘虚拟码
js = DownCount; // 送出键盘 按下的次数。
return 1;
}
//---------------------------------------------------------------------------
int __stdcall EnableHook(bool flag) // 导出函数EnableHook()
{
if(flag)
{
if (NewHook==NULL){ // 安装新钩子
NewHook=SetWindowsHookEx(WH_JOURNALRECORD,
(HOOKPROC)KeyHook,
DllHinst,0);
return (NewHook != NULL); //操作成功 。
}
}
else
{
if (NewHook!=NULL)
{
UnhookWindowsHookEx(NewHook);
NewHook=NULL; // 卸掉新钩子
return 1;
}
}
}
//-------------------------
.def 文件,要和DLL 的工程文件名相同 —— 共享内存用
SEGMENTS ShareSEG CLASS 'ShareCLASS' SHARED
//测试 工程。
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "UnTestHookKeyBoard.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HINSTANCE hInst;
typedef int _stdcall _export (*TEnableHook)(bool flag);
typedef int _stdcall _export (*TGetKey)(char &key,int &num);
TEnableHook EnableHook;
TGetMouse GetMouse;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
hInst = LoadLibrary("HookKeyboard.dll");
if(hInst)
{
EnableHook =(TEnableHook) GetProcAddress(hInst,"EnableHook");
GetKey =(TGetKey) GetProcAddress(hInst,"GetKey");
}
else{
ShowMessage("DLL Add Fail");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Button1->Enabled = false;
if(!EnableHook)
{
ShowMessage("获取DLL函数失败");
return;
}
EnableHook(true);
char key;
int downcount;
while (!Application->Terminated)
{
// 不停在从DLL中取回键盘 按键
GetKey(key,downcount);
Edit1->Text=key; //按下的字符 (不可见的显示不出来,但已经拦截到了)
Edit2->Text=downcount; // key down 次数
Sleep(50);
Application->ProcessMessages();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Button1->Enabled = true;
EnableHook(false);//停止 钩子
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
if(hInst)
{
FreeLibrary(hInst);
}
}
//---------------------------------------------------------------------------
自己想 拦截什么键,自己写吧。Top
12 楼constantine(飘遥的安吉儿)回复于 2003-12-04 20:15:27 得分 0
不就是注册热键吗!Top
13 楼ynkmsun(sun)回复于 2003-12-06 23:24:57 得分 0
bcbsoft(苍之雪)的方法试成功了!yjy1001(蓝鲸--优秀得郁闷的鱼)的方法我还同有全搞懂,估计应该可以的,先给分了,谢谢各位大哥的帮助!Top




