关于键盘钩子和选择目录配合使用的有关问题可能是一个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);
}