2009-03-27 2 views
5

나는 또한 내가 일하고있는 설치 프로그램의 부트 스트랩이 될 응용 프로그램을 만들고 있습니다. 응용 프로그램은 응용 프로그램의 기본 창인 마법사를 구성하는 데 필요한 정보를 얻기 위해 몇 번의 MSI 호출을 수행합니다.이 창은 정보가 수집되는 동안 진행 창이 열리고 완료되면 사라집니다. 그런 다음 마법사가 설정되고 실행됩니다. 내 문제는 (CPropertySheet에서 파생 된) 마법사가 앞에 오지 않고 그렇게하기위한 호출을 추가하지 않고 활성 응용 프로그램이되기를 원하지 않는다는 것입니다.어떻게하면 앱이 앞으로 나오게하고 포커스를 맞출 수 있습니까?

SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // force window to top 
SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // lose the topmost status that the previous line gave us 

내 문제는 내가 아직 창을 만드는 방법을 알아 냈하지 않은 것입니다 :

나는 나의의 OnInitDialog() 메소드에 다음 코드를 전면에 데려의 문제를 해결했습니다 self-activate (즉, 자신이 초점을 가진 사람이되게하십시오). SetFocus()는이 컨텍스트에서 작동하지 않습니다. 창문을 Z-order의 꼭대기로 밀어 넣고 가능한 한 적은 수의 호출로 창을 활성화시키는 무언가가 필요합니다.

내 생각 엔 MSI 호출에 의해 처음 열렸던 진행 창이 메인 윈도우를 망가 뜨리는 원인으로 보이지만 그 창이 나타나지 않도록 할 방법이 없다. 또한, 주 윈도우가 도착하기 전에 어떤 일이 일어나는지 사용자에게 알려주므로 숨길 수는 없습니다.

답변

0

ShowWindow (youwindow, SW_SHOWNORMAL)가 작동하지 않습니까? -don

+0

시도하지는 않았지만 BringWindowToTop()보다 효과적이지는 않습니다. (미치 Wheat의 대답에 내 의견을 참조하십시오.) – RobH

0

BringWindowToTop 또는 SetForegroundWindow에는 다른 모든 창 (응용 프로그램)보다 실제로 강제로 앞쪽에 있어야하는 요구 사항이 있습니다. 이러한 사항이 충족되지 않으면 Windows에서 작업 표시 줄의 응용 프로그램 아이콘 만 깜박입니다. This 기사는 그 주위에 방법을 제시하지만 1800 INFORMATION이 지적 했으므로 권장하지 않습니다. 나는 당신이 그것을 받아 들여야 만 할 것 같아요.

+0

하지 마십시오. 레이몬드 첸 (Raymond Chen)은 이것이 종종 앱이 멈추는 원인을 설명합니다. http://blogs.msdn.com/oldnewthing/archive/2008/08/01/8795860.aspx –

+0

감사합니다. 내 대답을 편집했습니다. –

7

포커스를 훔칠 수 없습니다. 기간.

https://blogs.msdn.microsoft.com/oldnewthing/20090220-00/?p=19083

+1

감사합니다.이 질문에 대한 답변으로이 기사를 찾고있었습니다.이 글을 읽은 모든 사람에게 내부화하고 전경 활성화를 도용하려는 바이러스 밈을 수정하십시오. 하지만 내 애플 리케이션은 특별하다! 앱이 사용자에게 적대적입니다. 하지 마! –

+1

본인은 동의하며 모든 사람이이 내용을 저자에게 적용하지만이 사람 (또는 다른 사람)에게이 기능이 필요한 좋은 이유가있을 수 있습니다 (폐쇄 형 시스템, 개인용 또는 가정용 컴퓨터에만 해당). 사용법을 권장하지만 정보를 숨기지 마십시오. –

+1

나는 마이크로 소프트가 언젠가 모든 포커스 훔치기를 한 번에 모두 해결할 것을 희망한다. 초점을 훔치는 프로그래머는 시베리아로 보내야합니다. 적나라한. – snemarch

7

앤드류가 완전히 정확하지 :

이 오래된 새 살아라 문서를 참조하십시오. Windows는 포커스를 훔치는 것을 막기 위해 열심히 노력하지만 folowing 방법을 사용하여 가능합니다.

  1. 현재 포커스가있는 창의 스레드에 연결하십시오.
  2. 창에 초점을 맞 춥니 다.
  3. 실에서 분리하십시오.

그리고 그의 코드 이런 식으로 뭔가를 갈 것이라고는 :

DWORD dwCurrentThread = GetCurrentThreadId(); 
DWORD dwFGThread  = GetWindowThreadProcessId(GetForegroundWindow(), NULL); 


AttachThreadInput(dwCurrentThread, dwFGThread, TRUE); 

// Possible actions you may wan to bring the window into focus. 
SetForegroundWindow(hwnd); 
SetCapture(hwnd); 
SetFocus(hwnd); 
SetActiveWindow(hwnd); 
EnableWindow(hwnd, TRUE); 

AttachThreadInput(dwCurrentThread, dwFGThread, FALSE); 

당신은 또는이 작동하려면 관리자 권한으로 프로그램을 실행해야 할 필요하지 않을 수도 있습니다,하지만 난이 사용했습니다 개인적으로 코드를 작성하면 작업이 완료됩니다.

+0

이것은 Windows 10 1703에서 작동하지 않습니다 (작성자 업데이트). –

관련 문제