this->Hide() 只工作一次
this->Hide() works only once
My environment: C++ Builder XE4
我正在处理 hiding/showing 来自其他应用程序的一个应用程序,两者都是使用 XE4 构建的。
两个项目
- UnitShow:到show/hideUnitHide
- UnitHide: 来自 UnitShow
shown/hidden
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
- 在 UnitHide 上,单击 B_hide >> UnitHide 未隐藏
我预计第二次 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显示后,isShowing
是false
。有了这个,似乎 this->Hide()
不起作用(第二次之后)。
另一方面,使用 ShowWindow(this->Handle, SW_HIDE);
时 isShowing
总是 true
。这样,第二次后隐藏就可以了。
对于this->Hide()
,似乎我必须使用其他应用程序中的this->Show()
,目前我不知道该怎么做。
My environment: C++ Builder XE4
我正在处理 hiding/showing 来自其他应用程序的一个应用程序,两者都是使用 XE4 构建的。
两个项目
- UnitShow:到show/hideUnitHide
- UnitHide: 来自 UnitShow shown/hidden
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
- 在 UnitHide 上,单击 B_hide >> UnitHide 未隐藏
我预计第二次 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显示后,isShowing
是false
。有了这个,似乎 this->Hide()
不起作用(第二次之后)。
另一方面,使用 ShowWindow(this->Handle, SW_HIDE);
时 isShowing
总是 true
。这样,第二次后隐藏就可以了。
对于this->Hide()
,似乎我必须使用其他应用程序中的this->Show()
,目前我不知道该怎么做。