그것은 어떻게 생겼습니까?
해당 문제와 가까운 동작은 하나 뿐이며 항상 위 동작입니다.
아마도 프로그램 자체의 일부 코드가 창의 속성을 변경했을 수 있습니다 ...
창은 "항상 상단"으로 설정되어 있습니까?
항상 위에있는 양식을 만드는 방법 은 두 번째 매개 변수가 HWND_TOPMOST로 설정된 상태에서 SetWindowPos 가 호출되었음을 보여줍니다. 그러면 바로 위에 배치되어 유지됩니다.
빠른 Google 검색 후이 결과 는 User32.dll 이이 기능의 소유자 임을 나타냅니다 .
누가 내 창을 "항상 맨 위에"설정합니까?
함수가 무엇인지 알고 있으므로 함수가 언제 호출되는지 알고 싶습니다. 이를 위해서는 스택 추적을 작성하고 분석해야하지만 Windows Performance Toolkit에서 이를 수행 할 수 있지만 Rohitab Batra가 멋진 Api Monitor를 작성하게되어 매우 기쁩니다 .
죄송하지만 어려운 숙제입니다.
이제 일부 프로세스를 연결하려고합니다. 주의 사항 : PID를 기준으로 정렬 winlogon.exe
하고 그보다 낮은 PID 를 사용 하거나 연결하지 않으면 시스템이 중단되거나 충돌 할 수 있습니다. 다른 프로세스에서도이 동작이 발생할 수 있지만 어떤 프로세스를 연결할 수 있는지 확인하는 것은 시행 착오와 같습니다. 그래서:
- PID를 기준으로 정렬하고보다 새로운 것을 연결하십시오
winlogon.exe
.
- 모든 것이 잘 진행되면 Hooked Process 대화 상자 에서 스레드를 살펴볼 수 있습니다 .
다음과 같은 API 호출을 찾으십시오.
SetWindowPos (0x000000000002043c, HWND_BOTTOM | 0x00000000fffffffe , 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE)
에 대한 호출 을 SetWindowPos 와 HWND_BOTTOM | 0x00000000fffffffe ( -2 + 1 = -1 = HWND_TOPMOST )는 우리가 추구하는 것이며이 호출을 수행하는 프로세스는 문제의 원인입니다.
포기 ... "Always On Top"문제를 어떻게 해결할 수 있습니까?
화재와의 전쟁, 우리는 모든 창을 HWND_NOTOPMOST 로 설정합니다 .
프로그래밍, 프로그래밍! 그러나 이것은 스크립팅을 통해 쉽게 수행 할 수 있습니다 ...
매우 간단한 숙제 :
AutoIt v3를 다운로드하십시오 .
다음 을 포함 하는 ByeByeTopMost.au3 파일을 작성하십시오 .
While 1
$var = WinList()
For $i = 1 to $var[0][0]
WinSetOnTop($var[$i][1], "", 0)
Next
Sleep(5000)
WEnd
시작 폴더에 넣고 실행하거나 재부팅하십시오.
또는 숙제가 마음에 들지 않으면 내가 만든 이 zip 파일을 다운로드 하십시오 .
즐거운 시간 되세요 ... :-)
추신 : 이 마지막 경우 "항상 상단"기능을 사용할 수 없습니다. 문제 해결 또는 해결 방법 ... ;-)