2016-04-13 4 views
2
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 показано
  • На UnitHide, нажмите B_hide >> UnitHide не спрятался

I ожидается, что нажатие кнопки 2-го B_hide скроет UnitHide.

В чем причина этой проблемы?

+1

Бессмысленный вызов 'GetDesktopWindow'. Вы можете передать 'NULL' как первый аргумент' FindWindowEx' для эффекта sam. –

ответ

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++

Обновление

, как 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; 
+0

Этот код ведет себя точно так же, как в вопросе, если я не ошибаюсь. Я? Это также написано не на том языке. Языки переключения не изменят поведение. –

+0

@DavidHeffernan Я не уверен, что его идентичная функция FindWindow вместо FindWindowEx ..etc. Все эти вызовы API выглядят одинаково на любых языках. – RepeatUntil

+0

Так что это догадка без ожидания того, что что-то изменится. Использование «ShowWindow» в шкуре другое. Почему ты бы так поступил? Почему метод «Скрыть» не работает? –

1

Я попробовал следующее.

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() не работает (после второго раза).

С другой стороны, с использованием isShowing является true всегда. При этом скрывается после второго раза.

Для this->Hide(), кажется, что я должен использовать this->Show() из другого приложения, которое в настоящее время я не знаю, как это сделать.

+0

Это похоже на часть вопроса, а не на ответ. –

+0

Возможно, решение является настраиваемым сообщением, которое вы отправляете в другое приложение. Когда он его получает, он вызывает Show или Hide. –

+0

@DavidHeffernan Большое спасибо. Таким образом, отправляя сообщение из другого приложения, оно может инициировать целевое приложение для вызова этого -> Show(). – sevenOfNine

Смежные вопросы