Stackoverflow
で質問していた、うまく動作しない件が解決した。
やろうとしていたこと
Hide状態のソフトを他ソフトからShowにするということをしたかった。
- UnitShowソフト: UnitHideソフトをHideからShow状態にする
- UnitHideソフト: 自身のボタンでHide状態にする
code v0.1
2つのソフトでそれぞれの以下のユニットのコードを実装した。
UnitShow.cpp
void __fastcall TFormShow::B_showClick(TObject *Sender)
{
HWND hwnd = GetDesktopWindow();
hwnd = FindWindowEx(hwnd, NULL, L"TFormHide", NULL);
ShowWindow(hwnd, SW_SHOWNORMAL);
}
UnitHide.cpp
void __fastcall TFormHide::B_hideClick(TObject *Sender)
{
this->Hide();
}
上記の状態で以下の操作をしてもHideになるのは1回だけで、2回目以降はHideにならなかった。
- On UnitHide, click B_hide >> UnitHide is hidden
- On UnitShow, click B_show >> UnitHide is shown
- On UnitHide, click B_hide >> UnitHide is not hidden
code v0.2
どうも this->Hide()がうまく機能しなくなるようだった。
以下のコードでは動いた。
UnitShow.cpp
void __fastcall TFormShow::B_showClick(TObject *Sender)
{
HWND hwnd = GetDesktopWindow();
hwnd = FindWindowEx(hwnd, NULL, L"TFormHide", NULL);
ShowWindow(hwnd, SW_SHOWNORMAL);
}
UnitHide.cpp
void __fastcall TFormHide::B_hideClick(TObject *Sender)
{
// this->Hide();
ShowWindow(this->Handle, SW_HIDE);
}
this->Hide()とShowWindow(this->Handle, SW_HIDE);は挙動が違うようだ。
this->Hide()はフォームをHideする。
ShowWindow()はソフトをHideしているのだろうか?
http://www.festra.com/eng/snip10.htm
this->Showingの値を見ているとどうもそのようだ。
this->Hide()に対応するにはthis->Show()を使用して、ShowWindows(,SW_HIDE);に対応するにはShowWindow(,SW_SHOWNORMAL);を使用いたほうがよいように思う。
http://qc.embarcadero.com/wc/qcmain.aspx?d=1322
を見ているとShowWindow()はFormのVisibleプロパティをTrueにはしないようだ。そのため、2回目以降のthis->Hide()は無効になる。