title: Problem with Keyboard hook proc
body: <p>The background: My form has a TWebBrowser. I want to close the form with ESC but the TWebBrowser eats the keystrokes - so I decided to go with a keyboard hook.</p>
  
  <p>The problem is that the Form can be open in multiple instances at the same time.</p>
  
  <p>No matter what I do, in some situations, if there are two instances open of my form, closing one of them closes the other as well.</p>
  
  <p>I've attached some sample code. Any ideas on what causes the issue?</p>
  
  <pre><code>var
    EmailDetailsForm: TEmailDetailsForm;
    KeyboardHook: HHook;
  
  implementation
  
  function KeyboardHookProc(Code: Integer; wParam, lParam: LongInt): LongInt; stdcall;
  var
    hWnd: THandle;
    I: Integer;
    F: TForm;
  begin
    if Code &lt; 0 then
      Result := CallNextHookEx(KeyboardHook, Code, wParam, lParam)
    else begin
      case wParam of
        VK_ESCAPE:  
          if (lParam and $80000000) &lt;&gt; $00000000 then
          begin
            hWnd := GetForegroundWindow;
            for I := 0 to Screen.FormCount - 1 do
            begin
              F := Screen.Forms[I];
              if F.Handle = hWnd then
                if F is TEmailDetailsForm then
                begin
                  PostMessage(hWnd, WM_CLOSE, 0, 0);
                  Result := HC_SKIP;
                  break;
                end;
            end; //for
          end; //if
        else
          Result := CallNextHookEx(KeyboardHook, Code, wParam, lParam);
      end;  //case
    end;  //if
  end;
  
  function TEmailDetailsForm.CheckInstance: Boolean;
  var
    I, J: Integer;
    F: TForm;
  begin
    Result := false;
  
    J := 0;
  
    for I := 0 to Screen.FormCount - 1 do
    begin
      F := Screen.Forms[I];
      if F is TEmailDetailsForm then
      begin
        J := J + 1;
        if J = 2 then
        begin
          Result := true;
          break;
        end;
      end;
    end;
  end;
  
  procedure TEmailDetailsForm.FormCreate(Sender: TObject);
  begin
      if not CheckInstance then    
        KeyboardHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, 0, GetCurrentThreadId());
  end;
  
  procedure TEmailDetailsForm.FormDestroy(Sender: TObject);
  begin
      if not CheckInstance then
        UnHookWindowsHookEx(KeyboardHook);
  end;
  </code></pre>