Страница 1 из 1

Переключится на прошлый процесс

Добавлено: 09 авг 2004, 18:55
SeregaLBN
Хочу из своей проги переключится на предыдущую - как по нажатию Alt+Tab.
Как это сделать?

Я это делаю сейчас так (но это не совсем правильно):

Код: Выделить всё

BOOL CALLBACK ___EnumWindowsProc(
  HWND hWnd,      // handle to parent window
  LPARAM lParam   // application-defined value
) {
   if ((hWnd != (HWND)lParam)
      &&  ::IsWindowVisible(hWnd)
      &&  ::IsWindowEnabled(hWnd)
      //&& (::GetParent(hWnd) == ::GetDesktopWindow())
      )
   {
      TCHAR szText[1024] = {0};
      ::GetWindowText(hWnd, szText, 1024);
      if (szText[0]) {
         ::SetWindowPos((HWND)lParam, HWND_BOTTOM, 0,0,0,0, SWP_NOSIZE | SWP_NOMOVE);
         ::SetForegroundWindow(hWnd);
         ::SetActiveWindow(hWnd);
         ::SetFocus(hWnd);
         return FALSE;
      }
   }
   return TRUE;
}

void SetBack() 
{
   HWND hWnd = ::GetActiveWindow();
   ::EnumWindows(___EnumWindowsProc, (LPARAM)hWnd);
   //::EnumDesktopWindows(NULL, ___EnumWindowsProc, (LPARAM)hWnd);
}

Добавлено: 09 авг 2004, 22:45
Romeo
Попробуй заюзать keybd_event - так будет по крайней мере, более логично. А то енамить все окна до добра не доведёт. Тем более кто тебе сказал, что они отенамяться в том же порядке, в котором Atl+Tab по ним бегает? :)

Добавлено: 10 авг 2004, 09:24
Hawk
Лучше сделать GetWindow(hWndMain, GW_HWNDPREV) где hWndMain основное окно приложения (у которого нет парентов и овнеров). Кроме того надо проверить, что у этого окна нет стилей WS_POPUP и WS_EX_TOOLTIP, если есть - ещё раз вызвать GW_HWNDPREV.
Да и на будущее SetActiveWindow(hWnd); и SetFocus(hWnd); не работают для окон в другом процессе, впринципе тут этого и не надо, можно оставить SetForegroundWindow и GetForegroundWindow, но если сильно надо, то можно подключиться к процессу с помощью AttachThreadInput.

Добавлено: 10 авг 2004, 14:20
SeregaLBN
Сенкс, Hawk.
Теперь я выполняю это так:

Код: Выделить всё

void SetBack() 
{
   HWND hWnd = ::GetActiveWindow();//::GetTopWindow(NULL);
   while (NULL != ::GetParent(hWnd)) {
      hWnd = ::GetParent(hWnd);
   }

   BOOL bRes;
   do {
      hWnd = ::GetNextWindow(hWnd, GW_HWNDNEXT);
      LONG lStyle = ::GetWindowLong(hWnd, GWL_STYLE);
      bRes = (lStyle & WS_POPUP);
      lStyle = ::GetWindowLong(hWnd, GWL_EXSTYLE);
      bRes |= (lStyle & WS_EX_TOOLWINDOW);
      bRes |= !::IsWindowVisible(hWnd);
   } while (bRes);
   bRes = ::SetForegroundWindow(hWnd);
   //::SetWindowPos(hWnd, HWND_TOP, 0,0,0,0, SWP_NOSIZE | SWP_NOMOVE);
   if (::IsIconic(hWnd))
      ::ShowWindow(hWnd, SW_RESTORE);
}