关于键盘钩子和选择目录配合使用的有关问题可能是一个BUG
关于键盘钩子和选择目录配合使用的问题可能是一个BUG
BCB6
代码如下
//---------------------------------------
#include <vcl.h>
#include <FileCtrl.hpp>
#include <SysUtils.hpp>
#pragma hdrstop
#include "CaptionU.h "
//---------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm "
TForm1 *Form1;
static HHOOK OldHook = NULL;
long CALLBACK KeyProc(int code, WPARAM wParam, LPARAM lParam);
//---------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
OldHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyProc, NULL, GetCurrentThreadId());
}
//---------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
UnhookWindowsHookEx(OldHook);
}
//---------------------------------------
long CALLBACK KeyProc(int code, WPARAM wParam, LPARAM lParam)
{
if (code> =0 && wParam==116) //F5 选择目录
{
Form1-> Button1-> Click();
}
return CallNextHookEx(OldHook, code, wParam, lParam);
}
//---------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String strDirPath = " ";
if (SelectDirectory( "选择目录 ", " ",strDirPath))
{
;
}
}
//---------------------------------------
问题:
在按F5选择完目录后选择窗口没有消失掉,需要再选择一次才能关掉选择窗口
而直接用按钮点击则不会出现这个问题
请大家帮忙解决
------解决方案--------------------
这是因为在安装了键盘钩子以后,键被按下和弹起都会触发一次KeyProc,所以按一次F5键,就会调用两次Button1Click事件,也就会出现两个选择目录的窗口。解决办法就是在KeyProc中,只响应键被按下的消息就可以了:
long CALLBACK KeyProc(int code, WPARAM wParam, LPARAM lParam)
{
if (code> =0 && wParam==116) //F5 选择目录
{
// 只有F5键被按下时才调用Button1Click事件
if((lParam & 0x80000000) == 0x80000000)
Form1-> Button1-> Click();
}
return CallNextHookEx(OldHook, code, wParam, lParam);
}
BCB6
代码如下
//---------------------------------------
#include <vcl.h>
#include <FileCtrl.hpp>
#include <SysUtils.hpp>
#pragma hdrstop
#include "CaptionU.h "
//---------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm "
TForm1 *Form1;
static HHOOK OldHook = NULL;
long CALLBACK KeyProc(int code, WPARAM wParam, LPARAM lParam);
//---------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
OldHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyProc, NULL, GetCurrentThreadId());
}
//---------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
UnhookWindowsHookEx(OldHook);
}
//---------------------------------------
long CALLBACK KeyProc(int code, WPARAM wParam, LPARAM lParam)
{
if (code> =0 && wParam==116) //F5 选择目录
{
Form1-> Button1-> Click();
}
return CallNextHookEx(OldHook, code, wParam, lParam);
}
//---------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String strDirPath = " ";
if (SelectDirectory( "选择目录 ", " ",strDirPath))
{
;
}
}
//---------------------------------------
问题:
在按F5选择完目录后选择窗口没有消失掉,需要再选择一次才能关掉选择窗口
而直接用按钮点击则不会出现这个问题
请大家帮忙解决
------解决方案--------------------
这是因为在安装了键盘钩子以后,键被按下和弹起都会触发一次KeyProc,所以按一次F5键,就会调用两次Button1Click事件,也就会出现两个选择目录的窗口。解决办法就是在KeyProc中,只响应键被按下的消息就可以了:
long CALLBACK KeyProc(int code, WPARAM wParam, LPARAM lParam)
{
if (code> =0 && wParam==116) //F5 选择目录
{
// 只有F5键被按下时才调用Button1Click事件
if((lParam & 0x80000000) == 0x80000000)
Form1-> Button1-> Click();
}
return CallNextHookEx(OldHook, code, wParam, lParam);
}