this-> Hide()只能运行一次

时间:2016-04-13 05:32:45

标签: delphi c++builder

My environment: C++ Builder XE4

我正在隐藏/显示来自其他应用程序的一个应用程序,这两个应用程序都是使用XE4构建的。

两个项目

  • UnitShow:显示/隐藏UnitHide
  • UnitHide:从UnitShow中显示/隐藏

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();
}

上面,我尝试了以下内容。

  • 在UnitHide上,点击B_hide>> UnitHide隐藏
  • 在UnitShow上,点击B_show>>单位隐藏显示
  • 在UnitHide上,点击B_hide>> UnitHide未隐藏

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

这个问题的原因是什么?

2 个答案:

答案 0 :(得分:1)

我尝试了以下内容。

var compiled = $('<div>', {css: {display: 'none'}})
   .append($compile(popoverContent)(scope)).appendTo('body');

button.popover({
  //... other config
  content: compiled.html()
});

当我使用void __fastcall TFormHide::B_hideClick(TObject *Sender) { bool isShowing = this->Showing; #if 1 this->Hide(); #else ShowWindow(this->Handle, SW_HIDE); #endif } 时,在UnitShow显示后,this->Hide()isShowing。有了这个,似乎false不起作用(第二次之后)。

另一方面,始终使用this->Hide() ShowWindow(this->Handle, SW_HIDE);isShowing。有了这个,第二次工作后就隐藏了。

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

答案 1 :(得分:0)

使用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 ++中执行相同的调用

<强>更新

正如雷米在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&gt;发送消息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;