2010-06-30 3 views
1

비표준 하드웨어 버튼 메시지를 기다리고 (CreateProcess를 사용하여) 응용 프로그램을 실행하는 숨겨진 프로세스가 있습니다. 사용자가 방해하지 않아도 문제는 아니며 사용자가 승인 한 행동입니다. 작업 표시 줄이 표시된 일반 레이아웃에서 자막이있는 자막이있는 자막이있는 경우에는 아무 문제가 없습니다. 그러나 현재 응용 프로그램이 전체 화면 인 XP 및 7에서는 상황이 다릅니다. 이 경우 전체 화면 응용 프로그램은 화면과 정확히 동일한 차원을 갖는 테두리가없는 창입니다. Windows는 항상 켜져 있어도 이러한 응용 프로그램의 작업 표시 줄을 숨 깁니다.Windows 7은 전체 화면 응용 프로그램을 다르게 취급합니까?

Xp에서는 작업 표시 줄이이 경우에 표시되고 응용 프로그램 (예 : 계산기)도 표시되며 실행 된 앱 및 작업 표시 줄 이외의 영역에는 전체 화면 앱이 계속 표시됩니다. ' 그러나 Windows 7에서는 시각적 인 일이 발생하지 않으며 전체 화면 앱은 계속 켜져 있으며 작업 표시 줄로 전환하면 실행 된 응용 프로그램이 나타납니다. 나는 SetForegroundWindow, BringWindowToTop, 심지어 AllowSetForegroundWindow (GetCurrentProcessId()) CreateProcess-WaitForIntputIdle-EnumThreadWindows 변경없이 발견 된 창 핸들을 호출하여 문제를 해결하려고했다. 그렇다면 공식적으로 문서화 된 전체 화면 창과 관련된 XP 이후로 어떤 변화가 있었습니까?

감사합니다,

최대

+0

'SetForegroundWindow'를 시도 할 때 오류 코드도 확인 했습니까? (BTW,'AllowSetForegroundWindow (GetCurrentProcessId())'는 의미가 없습니다.) http://blogs.msdn.com/b/oldnewthing/archive/2009/02/20/9435239.aspx) – jamesdlin

답변

0

윈도우는 여러 desktops을 지원하며, 내 생각 엔 전체 화면 업 (응용 프로그램이 표시됩니다) 디폴트가 아닌 다른 데스크탑을 사용하고 있다는 것입니다. Windows의 데스크탑 객체는 "논리적 인 디스플레이 표면이며 창, 메뉴 및 후크와 같은 사용자 인터페이스 객체를 포함합니다." 예를 들어 화면 보호기는 일반적으로 별도의 데스크톱에서 시작됩니다.

당신은 응용 프로그램이 프로세스 탐색기를 사용하여 실행되는 데스크톱 찾을 수 있습니다 :

  • 설정 프로세스 탐색기는 작업 관리자를 대체하고 항상 맨 위에 실행합니다. 전체 화면까지가 Ctrl 키 +
  • 을 참조하십시오이 프로세스의 핸들을 표시하려면 전체 화면 처리하고 Ctrl + H를 선택, 프로세스 탐색기 내에서 + Esc를
  • 시프트 누르면, 실행 프로세스 탐색기를 표시됩니다
  • 값 목록에있는 데스크톱 항목입니다. 일반적으로이 기본

당신은 당신이 먼저 바탕 화면에 핸들을 얻을 다음에 그것을 전달하는 OpenDesktop를 호출하여 동일한 바탕 화면에 당신의 프로세스를 시작할 수 있습니다에이 응용 프로그램이 실행되는 것을 바탕 알고있는 경우로 설정됩니다 CreateProcessSTARTUPINFO 전화.

+0

기본적으로 전체 화면 앱은 다른 모든 앱과 마찬가지로 –

+0

@ Franci Penov : 사실입니다.하지만 누가 문제의 앱을 사용한다고 말합니까? 물론 추측 일 뿐이므로이 경우 CreateProcess로 시작된 프로세스는 표시되지 않으며 OP에서 설명한 것과 똑같은 증상을 보게됩니다. –

+0

이것이 맞는 것 같습니다. 그러나 별도의 데스크톱에서 실행하는 것은 매우 드문 시나리오이므로 OP가 명시 적으로 언급했을 것입니다. –

1

Vista는 desktop composition 기능을 도입했습니다. 즉, 모든 창은 메모리 비트 맵으로 그리기 때문에 바탕 화면 창 관리자는이 비트 맵을 작성하고 전체 화면 Direct3D 화면에 그립니다. 전체 화면 창은 데스크톱 구성에 참여하지 않고 화면에 직접 그려집니다 (대부분의 전체 화면 앱은 실시간 화면 업데이트가 필요한 게임이기 때문에).

특히, 전체 화면 응용 프로그램이 실행 중일 때 DWM 작성 이미지를 덮고 있으며 사용자가 DWM 관리 창으로 전환하여 DWM이 전체 화면 위에 그리기를 시작해야 함을 의미합니다 - 스크린 애플 리케이션.

불행히도 귀하의 문제에 대한 좋은 해결책이 없습니다.이를 해결하는 한 가지 방법은 앱에 WS_CAPTION 스타일을 추가 한 다음 WM_NCPAINT/WM_NCCALCSIZE/WM_NCHITTEST 자신을 처리하는 것입니다. 이렇게하면 DWM에 누워서 일반 창 응용 프로그램이라는 거짓말을 할 수 있지만 시각적으로 NC 영역을 변경하여 제목이없는 것처럼 보입니다. 그러나이 작업에는 일정량의 추가 코드가 필요하며 투자하려는 노력이 조금 더 필요할 수 있습니다.

문제를 해결할 수있는 또 다른 방법은 새 프로세스를 시작할 때 전체 화면 응용 프로그램 창을 명시 적으로 최소화하는 것입니다. 그러나 그런 다음 다시 최대화 할 때의 문제를 해결해야합니다.

Btw, 흥미로운 Raymond Chen의 this post에 대한 의견을 찾을 수 있습니다.

+0

제 생각에, 데스크탑 구성은'SetForegroundWindow','BringWindowToTop' 등의 호출에 영향을 미치지 않아야합니다. –

+0

'SetForegroundWindow'는 백그라운드 프로세스가 게임에서 터지는 것을 막기 위해 전체 화면 응용 프로그램을 방해 할 수 없습니다. 'BringWindowToTop'은 Z- 순서를 조작하고 전체 화면 앱은 일반 z- 주문에 참여하지 않습니다 (또는 활성화되었을 때 최상위로 설정되었습니다 - 정확하게 기억하지 못합니다). –

+0

다시, 나는 이것을 조사하지 않았습니다. 2 년이 지났기 때문에 내가 아는 모든 것을 잊어 버렸을지도 모른다. :-) –

1

자신의 하드웨어 장치가 있다면 "실제"사용자 입력을 생성하기위한 API가 있다고 상상해보십시오. 분명히 레거시 키보드와 마우스, 그리고 이제 USB HID 드라이버 (대다수는 usermode라고 생각합니까?)는 API에 액세스 할 수 있습니다.

예를 들어 Synergy +는 연결된 PC에서 가짜 키보드 및 마우스 이벤트를 생성 할 수 있으며 위장 된 입력의 결과로 Windows 정품 인증이 전환됩니다.

그래서, 내 초기 아이디어는 실제 키보드 메시지를 합성하여 사용자 모드 "장치"응용 프로그램입니다 -. SendInput을 "이 API 할 수있는"가짜 "실제 사용자 입력 이벤트에 대한 가능성이 후보를 보인다

다음에,을 사용하여 귀하의 "UI"응용 프로그램에서 RegisterHotKey와 같은 API를 사용하여 장치 응용 프로그램이 생성하는 단축키 조합에 응답 할 수 있습니다 ..

이제 SendInput이 올바른 수준에서 사용자 입력 이벤트를 생성한다고 가정하면 다음과 같은 WM_HOTKEY 처리기에서 귀하의 UI 응용 프로그램)은 (사용자가 "사용자가 시작했기"때문에) 전경 윈도우를 변경하기 위해 허가를 받았습니다 (자신에게).