2014-11-25 7 views
0

플로팅 환경 설정 창이있는 C 프로그램의 소프트웨어 개발자와 함께 일하고 있습니다. 광산이 작동 중일 때 Windows 작업 표시 줄을 사용하여 다른 프로그램으로 전환하면 전환 된 프로그램 위에 부동 창이 계속 남아 있습니다. 나는 프로그래머가 아니며 프로그래머가이를 막을 방법이 없다고 말하고있다. 나는 그가 SetWindowPosition과 TOPMOST라는 것을 사용하여이 윈도우에 최상위에 머물 수있는 특권을 부여한다고 들었다. 내 프로그램에서 일하는 동안 맨 위에있는 것을 좋아하지만 다른 프로그램으로 전환 할 때가 아닙니다.SetWindowPostion TOPMOST

다른 프로그램으로 전환해도이 창은 최상위로 남아 있지 않지만 내 프로그램으로 돌아 가면 맨 위에 머물러있게 할 수있는 것이 있습니까?

+0

질문 제목을 "현재 프로그램이 모호하고"모든 프로그램에 "있는 경우에만"내 프로그램의 창에만 적용하고 다른 프로그램에는 적용하지 않으려면 어떻게해야합니까? "와 같은 질문 제목을 변경하는 것이 좋습니다. 훨씬 더 일반적인 것 같다 ... – andlabs

답변

0

WM_ACTIVATE 메시지를 사용할 수 있습니다. 창을 활성화하거나 비활성화하면 Windows에서이 메시지를 보냅니다. 사용자가 다른 응용 프로그램으로 전환하면 응용 프로그램의 현재 창에 WM_ACTIVATE 메시지가 수신되어 비활성화 중임을 알립니다.

LRESULT __stdcall YourWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (uMsg) 
    { 

    /* ... */ 

    case WM_ACTIVATE: 
     DWORD pid = 0; 

     GetWindowThreadProcessId((HWND)lParam, &pid); 
     if (pid != GetCurrentProcessId()) /* switch to another task? */ 
     { 
      if ((wParam == WA_ACTIVE) || (wParam == WA_CLICKACTIVE)) 
      { 
       if (SetWindowPos(hFloatingWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE) == FALSE) 
       { 
        /* handle error */ 
       } 
      } 
      else 
      { 
       if (SetWindowPos(hFloatingWindow, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE) == FALSE) 
       { 
        /* handle error */ 
       } 
      } 
     } 
     return (0); /* message processed */ 

    /* ... */ 
} 

참고 추가해야합니다 : 여기

다른 응용 프로그램에 대한 사용자 전환합니다 ( hFloatingWindow을 고려하여 부동 창에 창 핸들입니다) 때 맨 위 플래그를 제거/설정하는 작은 예입니다 응용 프로그램의 모든 창 프로 시저에 WM_ACTIVATE 코드 이것은 사용자가 활성화되어있는 창에서 다른 작업으로 전환 할 수 있기 때문에 필연적입니다. 그리고 위의 그림과 같이 현재 활성 창에서 WM_ACTIVATE 메시지를 처리하지 않으면 최상위 플래그가 제거되지 않습니다.

3

한 가지 방법은 윈도우가 최상위 (즉 HWND_TOPMOST 플래그 SetWindowPos를 호출하지, 그리고 WS_EX_TOPMOST 창 스타일을 설정되지 않음) 모든하지만 메인 창으로을 소유 창 을 할 수 있도록하지 않는 것입니다.

이렇게하려면 (CreateWindowEx을 사용하여) 부동 창을 만들 때 주 창 핸들을 부모로 지정합니다.

소유 된 창은 항상 소유자 위에 표시되지만 여전히 부동 상태이며 다른 응용 프로그램의 창 뒤에 있습니다.

+0

그냥 그것에 대해 물었고 그 문제는 우리가 이미 주 창에서 소유하고있는 일부 창을 가지고 우리는 이들이 메인 윈도우보다 우선 순위가 필요하지만, 환경 설정 창. 메인 프로그램 (파일, 설정 편집 창 등 -> 수레가있는 소유 창 -> 주 프로그램에서 열리는 다른 기본 설정 창, 소유 된 창보다 우선 순위가 높아지기 만 함) – emailcooke

+0

@ShawnCooke : "소유 한 창"이 소유 한 환경 설정 창을 만들 수 있습니까? 아니면 항상 열려 있지 않은 창입니까? 아니면 다른 창을 열 수 있습니까? 응용 프로그램이 활성 상태인지 여부를 추적하고 최상위 플래그를 적절하게 추가/제거하십시오. –