|
임펠리테리입니다.
미니마이즈되어 있는 프로그램 역시 빌더(혹은 델파이)로 작성하신 프로그램이죠?
VCL 어플리케이션의 경우, 프로젝트의 메인폼이 어플리케이션의 실제 메인 윈도우가 아닌 관계로, 화면에 나타나는 메인폼과 작업표시줄상의 프로그램 항목이 다른 윈도우입니다.
아마도 FindWindow()로 찾으신 윈도우 핸들이, 실제 메인 윈도우가 아닌 메인"폼" 인 것 같군요.
메시지에 의해 메인 폼만 리스토어되었을 경우, VCL 어플리케이션은 아직도 미니마이즈된 상태로 알고 있게 되고, 메인폼의 미니마이즈 버튼은 어플리케이션 자체를 미니마이즈 하므로, 현재 어플리케이션은 미니마이즈된 상태인지라 메인폼을 미니마이즈 할 수 없게 된 겁니다.
해결책은, 메인 "폼"이 아닌 실제의 메인 "윈도우"를 리스토어시키면 됩니다. 그러려면, FindWindow()를 할 때 클래스 이름인 첫 인자를 NULL로 넘기지 말고, "TApplication"으로 넘기면 됩니다.
그러면 어플리케이션 자체가 리스토어되므로, 리스토어된 메인폼의 미니마이즈 버튼이 제대로 동작할 겁니다.
그럼 참고하시길...
남병철 님이 쓰신 글 :
: 제 경우를 설명해 드리겠습니다.
: FindWindow로 핸들을 얻어서 SendMessage로 실행된 프로그램을 조작하려합니다.
: 문제는 조작이 안되더라도 그냥 미니마이즈 리스토어 맥시마이즈라도 하고싶은데...
: 문제가...
: 실행시킨 프로그램을 우측상단의 미니마이즈 버튼으로 작업표시줄에 넣은다음
: 프로그램 상에서 FindWindow 와 SendMessage를 사용하여 다시 화면으로 복귀시키는
: 것입니다.
: 복귀까지는 잘되었습니다.
: 문제는 복귀후에 다시 복귀된 프로그램의 우측상단의 미니마이즈 버튼이 작동하지
: 않는것이 문제입니다.
:
: 그래서 핸들을 구했을때 어떻게 이용하면 그폼의 조종을 마치 그냥 폼을 조종하듯이
: 할 수 있을까요?
: 예를 들면 그냥 폼에서는 Form1->Close(); 뭐 이런식으로 조작이 가능하지만 핸들을
: 구한 폼은 어떻게 해야 이런효과를 얻을 수 있을지 궁금합니다.
: 조금이라도 좋으니 한마디 부탁합니다.
:
:
: 이렇게해서 MyProgram이란 작업표시줄로 미니마이즈된 프로그램을 불러냈는데..
: 그이후에 다시 작업표시줄로 미니마이즈가 안되었습니다.
: (버튼이 있는 프로그램, MyProgram이란 테스트 폼)
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: SetForegroundWindow(FindWindow(NULL, "MyProgram"));
: SendMessage(FindWindow(NULL, "MyProgram") ,WM_SYSCOMMAND,SC_RESTORE,0);
: }
:
:
|