맨 위로 창을 가져와 내가 가지고 거기에 두 개의 2 창문이있는 Windows 프로그램 : 나는 HWND을 더블 클릭하면는 Win32 :
hwnd (main interface)
hwnd2 (toplevel window, no parent, created by hwnd)
, 나는 hwnd2 팝업 및 일부 데이터를 표시해야합니다, 그래서를 정상에 hwnd2 가지고이 기능을 사용
BringWindowToTop(hwnd2);
hwnd2는 맨 위로 가져하지만, 홀수 한 가지가있다. hwnd2를 다시 클릭하면 hwnd (메인 인터페이스)가 자동으로 다시 나타납니다. 이 문제를 해결하기 위해 다음 함수를 사용하려고했지만 그 중 일부는 작동하지 않습니다.
SetWindowPos(hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
//doesn't work
BringWindowToTop(hwnd2); //This is the function brings hwnd2 to top
SetForegroundWindow(hwnd2); //doesn't work
SetWindowPos(hwnd2, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
//doesn't work
SetWindowPos(hwnd2, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
// hwnd2 "always" on top, not what I want
SetActiveWindow(hwnd2); // doesn't work too (for replying to Magnus Skog, thanks)
SwitchToThisWindow(hwnd2, TRUE);// got the same problem with BringWindowToTop function
SwitchToThisWindow(hwnd2, FALSE);
이 문제를 어떻게 해결할 수 있습니까? 미리 감사드립니다.
이 (hwnd2가 구성되는 미디어 플레이어 (그것이 다시 다른 창/앞에 될 수 있도록 최상위 창을 할 필요가 있기 때문에 AJ 회신를 들어, hwnd2 부모가없는) 여러 윈도우, 윈도우 중 하나는 비디오 디스 플레이 용, 다른 두 개의 트랙 바 컨트롤은 진행 막대 및 볼륨 바, 하나의 툴바 컨트롤은 제어판 용).
(이 중 하나가 도움이 될 수 있습니다. hwnd2, hwnd는 "마우스가 메뉴 막대 및 비 클라이언트 영역을 포함하여 hwnd의 맨 위에 있습니다"와 같이 자동으로 팝업됩니다.
(이 미디어 플레이어는 Direct Show로 작성되었습니다. IVideoWindow :: put_Owner를 사용하여 비디오 윈도우를 비디오 소유자로 지정하고, Direct Show는 비디오 윈도우의 자식으로 서브 비디오 윈도우를 내부적으로 만듭니다. 소스 코드를 볼 수없는이 서브 비디오 창을 제외하고는 hwnd2에서 의심스러운 것을 볼 수 없습니다.)
Direct Show 때문에 이유를 찾았습니다. 멀티 스레드를 사용하여 실행 한 다음 문제가 해결되었습니다. 하지만 ... 왜?
이 문제는 SendMessage 대신 PostMessage를 사용하여 해결할 수 있습니다.
hwnd2에 부모가없는 이유는 무엇입니까? hwnd는 생성하는 동안 상위로 설정할 수 있습니다. –
hwnd2의 마우스 버튼 처리 코드에서 무엇을합니까? 거기 비린내가 뭐니? –
그래서 PostMessage를 사용하여 어떻게 해결 했습니까? –