2013년 6월 24일 월요일

SetForegoundWindow without taskbar flashing(blinking, flickering)


ㅡ.ㅡ ::SetForegoundWindow() 가 호출은 정상으로 되나 동작을 이상하게 할때가 있음.

특히 #Windows7 일때.

그럴때 써볼만한 팁들 모음

1. How to bring window to top with SetForegroundWindow()

2. SetForegroundWindow Win32-API not always works on Windows-

void SetForegroundWindowInternal(HWND hWnd)
{
 if(!::IsWindow(hWnd)) return;

 //relation time of SetForegroundWindow lock
 DWORD lockTimeOut = 0;
 HWND  hCurrWnd = ::GetForegroundWindow();
 DWORD dwThisTID = ::GetCurrentThreadId(),
  dwCurrTID = ::GetWindowThreadProcessId(hCurrWnd,0);

 //we need to bypass some limitations from Microsoft :)
 if(dwThisTID != dwCurrTID)
 {
  ::AttachThreadInput(dwThisTID, dwCurrTID, TRUE);

  ::SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT,0,&lockTimeOut,0);
  ::SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,0,0,SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE);

  ::AllowSetForegroundWindow(ASFW_ANY);
 }

 ::SetForegroundWindow(hWnd);

 if(dwThisTID != dwCurrTID)
 {
  ::SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,0,(PVOID)lockTimeOut,SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE);
  ::AttachThreadInput(dwThisTID, dwCurrTID, FALSE);
 }
}
















댓글 없음:

댓글 쓰기