Как сделать, чтобы окно открывалось поверх всех?

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Пытаюсь сделать программу Напоминатель, столкнулся с небольшой сложностью, когда пользователь сидит в ДОС окне во весь экран, то окошко всплывает , но в фоновом режиме, нужно сделать, чтобы Всплывающее окошко стало Активным (, чтобы из ДОс окна его автоматом на Высплывающее)

Всем спасибо!
Гость

Сообщение Гость »

ЕМНИП, так можно было сделать до win2k. Потом мелкомягкие одумались, и решили, что раздражать пользователей выплывающими окнами неправильно. И теперь окно может только поморгать на таскбаре или всплыть где-то на фоне.
Впрочем есть решения. Но вначале подумайте :)
Мне хочется отбить разработчикам таких программ все, что выступает наружу. Не глядючи что-то набираешь, тут вылетает окно с вопросом "Are you ABSOLUTELY sure... ?", и сходу давишь "Yes", потому, что не успеваешь остановить руку.
Иногда с непоправимыми последствиями :)


2.05. Когда вызываешь ShowWindow(...,SW_SHOW) из пpоцесса, не являющегося
foreground, на таскбаpе начинает мигать таб, соответствующий окошку.
Как заставить окно откpываться сpазу?

AllowSetForegroundWindow() или посылать ему клик по Caption. :)
комментарий: AllowSetForegroundWindow вызывать должен фореграунд
процесс, чтобы позволить другим процессам делать свое окно активным.
Так что этот метод применим только с использованием хука.

--
Best regards,
Maxim Yemelyanov,
Enigma Soft Company
phone: +380 572 177977
WEB: http://enigmasoft.com.ua
e-mail: clalist@enigmasoft.com.ua
ICQ: 12253836
Написал: ClaList(2)
Гость

Сообщение Гость »

Есть на самом деле масса ситуаций когда одна прога должна уметь активизировать свое окно без всяких морганий на таскбаре, когда в другой происходят определенные события, когда эти две проги работают как единая система. В свое время пришлось преодолевать эту проблему, в результате появилась такая процедура. Позволяет активизировать окно по его handle.

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

SetWinActive         PROCEDURE  (HWND hWnd)
hParentWnd                   HWND
hForWnd                      HWND
ForThreadID                  DWORD
CurThreadID                  DWORD
TmpDWORD                     DWORD

  CODE

  LOOP
     hParentWnd = GetParent(hWnd)

     IF hParentWnd ; hWnd = hParentWnd
     ELSE          ; BREAK.
  END

  hForWnd = GetForegroundWindow()

  IF hForWnd <> hWnd AND IsWindow(hWnd)

     CurThreadID = GetCurrentThreadId()
     ForThreadID = GetWindowThreadProcessId(hForWnd, TmpDWORD)

     IF CurThreadID = ForThreadID
        SetForegroundWindow(hWnd)
     ELSE
        IF AttachThreadInput(CurThreadID, ForThreadID, TRUE)
           SetForegroundWindow(hWnd)
           AttachThreadInput(CurThreadID, ForThreadID, FALSE)
        END
     END
  END
Удачи!
__________________________________
Владимир Якимченко (IСQ 16 993 194)
Написал: ClaList(2)
Ответить