this->Hide() 只工作一次

this->Hide() works only once

My environment: C++ Builder XE4

我正在处理 hiding/showing 来自其他应用程序的一个应用程序,两者都是使用 XE4 构建的。

两个项目

UnitShow代码如下:

void __fastcall TFormShow::B_showClick(TObject *Sender)
{
    HWND hwnd = GetDesktopWindow();
    hwnd = FindWindowEx(hwnd, NULL, L"TFormHide", NULL);

    ShowWindow(hwnd, SW_SHOWNORMAL);
}

UnitHide的代码如下:

void __fastcall TFormHide::B_hideClick(TObject *Sender)
{
    this->Hide();
}

以上,我尝试了以下方法。

我预计第二次 B_hide 按钮按下会隐藏 UnitHide。

这个问题的原因是什么?

使用 FindWindow 函数代替 FindWindowEx,如下所示:

procedure TfShow.btnShowClick(Sender: TObject);
var
  hWindow:Hwnd;
begin
  hWindow := FindWindow('TFormHide', nil);
  ShowWindow(hWindow, SW_SHOWNORMAL);
end;

关于 UnitHide 你可以在你的按钮中调用 self.hide

procedure TfHide.btnHideClick(Sender: TObject);
begin
  self.Hide; {Hide the hidden form }
  //or
  ShowWindow(Self.Handle, SW_HIDE);
end;

您可以在 C++ 中执行相同的调用

更新

正如 Remy 在他的 answer

中提到的

因此您可以使用以下内容:

在两个应用程序中定义自定义消息

const
  Show_MESSAGE = WM_USER + 1;
  Hide_MESSAGE = Show_MESSAGE + 1;

在 HideUnit 中为消息定义一个处理程序

  private
    { Private declarations }
    procedure WMShow(var Message: TMessage); message Show_MESSAGE;
    procedure WMHide(var Message: TMessage); message Hide_MESSAGE; 
....

implementation

procedure TfHide.WMShow(var Message: TMessage);
begin
  Self.Show;
end;

procedure TfHide.WMHide(var Message: TMessage);
begin
  Self.Hide;
end;

从 ShowUnit > Showbtn 发送消息

procedure TfShow.btnShowClick(Sender: TObject);
var
  hWndX : HWND;
begin
  hWndX := FindWindow('TfHide',nil);
  if hWndX <> 0 then begin
    SendMessage(hWndX, Show_MESSAGE, 0, 0);
  end
  else MessageBox(0, 'Window not found', 'Msg', 0);
end;

从隐藏表单中隐藏表单

procedure TfHide.btnHideClick(Sender: TObject);
begin
  SendMessage(Handle, Hide_MESSAGE, 0, 0);
end;

我尝试了以下方法。

void __fastcall TFormHide::B_hideClick(TObject *Sender)
{
    bool isShowing = this->Showing;
#if 1
    this->Hide();
#else
    ShowWindow(this->Handle, SW_HIDE);
#endif
}

当我使用this->Hide()时,在UnitShow显示后,isShowingfalse。有了这个,似乎 this->Hide() 不起作用(第二次之后)。

另一方面,使用 ShowWindow(this->Handle, SW_HIDE);isShowing 总是 true。这样,第二次后隐藏就可以了。

对于this->Hide(),似乎我必须使用其他应用程序中的this->Show(),目前我不知道该怎么做。