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

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
SeregaLBN
Сообщения: 23
Зарегистрирован: 17 фев 2004, 13:27
Откуда: Киев
Контактная информация:

Хочу из своей проги переключится на предыдущую - как по нажатию 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);
}
Серёга, любит баранью ногу.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Попробуй заюзать keybd_event - так будет по крайней мере, более логично. А то енамить все окна до добра не доведёт. Тем более кто тебе сказал, что они отенамяться в том же порядке, в котором Atl+Tab по ним бегает? :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Hawk
Сообщения: 216
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

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

Сенкс, 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);
}
Серёга, любит баранью ногу.
Ответить