将function SetHandle(AHandle: THandle): Boolean; stdcall;
 改成
function SetHandle(AHandle: THandle): Boolean; stdcall;
begin
  Result:= True;
  try
    Application.Handle := AHandle;
  except
    Result:= False;
  end;
end;
试试。 

解决方案 »

  1.   

    原因已经找到,但是不能改正过来。
    程序里安装的是一个全局钩子,全局钩子都是在dll中的。
    我们知道应用程序在调用dll的时候都是把dll的内存映射到自己的4g的内存空间中的,而且最重要的是dll中的全局数据在进程间是不能共享的,所以每一个调用该dll的应用程序都有一份dll的全局数据,本例中为两个变量hHk: HHOOK; GetHandle: THandle; 所以为什么会出现双击不同的应用程序会产生不同的结果就可以解释了。另外,从ShowMessage的caption上也可以看出这一点,因为ShowMessage的caption用的是 Application.Title;  我们一般都认为hook只不过是一个过程而以,而忽略了他的dll本性。本想改过来,可是在进程间共享全局数据有点难度