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

Поднятие приложения из таскбара

Добавлено: 16 Декабрь 2009, 10:34
Admin
Есть программа которая при сканировании штрихкода должна подняться из таскбара.
Этот пример сделан для теста.
Пробовал сотню разных вариантов поднятия программы но ни один нормально не работает...
Остановился на текущем... с момощь StayOnTop окна поднимаем прогу. Но фокус остается черт знает где...

Программу могут свернуть по Win+В, переключиться с нее с помощью Alt+Tab (могут и в DOS FullScreen режим.)
В любом случае она должна вверх подыматься..

Кто сможет помочь?

Заранее благодарю!

Re: Поднятие приложения из таскбара

Добавлено: 17 Февраль 2010, 19:24
WadimZapara
Так не годится?

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

Win Window,нужные_атрибуты,IMM
    End !Window
  CODE
    OPEN(Win)
    Win{PROP:Hide} = TRUE
    ACCEPT
      Case EVENT()
      Of EVENT:OpenWindow
      OrOf Event:Iconize                                   !пользователь нажал кнопку "свернуть" - IMM - для отлова этого события
      OrOf EVENT:CloseWindow
           If ShowWindow(Win{PROP:HANDLE}, SW_MINIMIZE).   !скрыть
           Win{Prop:Hide} = True
           Win{Prop:Active} = False
           Cycle

      Of EVENT:Надо_Поднять
            If ShowWindow(Win{PROP:HANDLE}, SW_SHOW).      !показать
            Win{Prop:Hide} = False
            Win{Prop:Iconize}= False
            SetForegroundWindow(Win{PROP:Handle})          !поставить на него фокус
            Win{Prop:Active} = TRUE
      Of EVENT:CloseDown
           Break
      End !Case
    END !ACCEPT
    Close(Win)
(ну с добавлением CFC_)
А для оnработки окном SetWindowPos нужен, если не ошибаюсь, сабклассинг с обработкой события винды WM_WINDOWPOSCHANGED
return ( DefWindowProcA(hWnd, wMsg, wParam, lParam) )

Re: Поднятие приложения из таскбара

Добавлено: 17 Февраль 2010, 23:11
WadimZapara
ВСЕГДА НАВЕРХУ ЧЕРЕЗ 10 СЕКУНД - ДО НАЖАТИЯ НА КНОПКУ:
<СКРЫТЬ> - снова таймер на 10 с, <Закрыть приложение> - по тексту

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

                    PROGRAM
                    MAP
                      Module('Windows')
                        DefWindowProc(UnSigned hWnd, UnSigned wMsg, UnSigned wParam, UnSigned lParam),Long,Pascal,Name('DefWindowProcA')
                      End
                      MyProcess
                      SubClassFunc(UnSigned hWnd, UnSigned wMsg, UnSigned wParam, UnSigned lParam),LONG,Pascal
                    END
                    INCLUDE('KEYCODES.CLW')
                    INCLUDE('CFCAPI.inc')


SavedWnd     Group,Type
WndProc        ULong
Thread         ULong
             End

  CODE
  MyProcess

MyProcess   PROCEDURE
Win  WINDOW('Datamart'),AT(,,395,224),FONT('MS Sans Serif',8,,FONT:regular),CENTER,IMM,ICON('actions.ico'),CENTERED,SYSTEM,GRAY,MAX,RESIZE
       BUTTON('Закрыть приложение'),AT(15,14,107,43),USE(?Ex),KEY(AltX)
       BUTTON('СКРЫТЬ'),AT(151,14,107,43),USE(?Hd),SKIP
     END
sw  Group(SavedWnd).
WS_EX_TOOLWINDOW    EQUATE(80h)

HWND_TOPMOST        EQUATE(-1)
SWP_NOSIZE          Equate(01h)
SWP_NOMOVE          Equate(02h)
SWP_NOACTIVATE      Equate(10h)
Sized_First         Byte(TRUE)
  CODE
  OPEN(Win)
  Win{PROP:Hide} = TRUE
  CFC_SetWindowLong( Win{PROP:Handle}, CFC_GWL_EXSTYLE, WS_EX_TOOLWINDOW )
  sw.WndProc = Win{PROP:WndProc}
  sw.Thread  = Thread()
  Win{PROP:WndProc} = Address(SubClassFunc)
  CFC_SetWindowLong( Win{PROP:Handle}, CFC_GWL_USERDATA, Address(sw.WndProc) )

  ACCEPT
    Case EVENT()
    Of EVENT:OpenWindow
         Win{PROP:Timer} = 1000
    OrOf Event:Iconize                                   !пользователь нажал кнопку "свернуть" - IMM - для отлова этого события
    OrOf EVENT:CloseWindow
         Cycle

    Of EVENT:Timer
         Win{PROP:Text} = ''
         Win{PROP:NoFrame} = TRUE
         Win{PROP:Maximize} = TRUE
         Win{Prop:Hide} = False
         Win{Prop:Iconize}= False
         Win{Prop:Active} = TRUE
         Win{PROP:Timer} = 0
         CFC_SetWindowPos(Win{PROP:Handle}, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE+SWP_NOSIZE+SWP_NOACTIVATE)
         POST(EVENT:USER)

    Of EVENT:Sized
      If Sized_First Then
        Clear(Sized_First);  Cycle
      End
    OrOf EVENT:LoseFocus
    OrOf EVENT:Suspend
    OrOf EVENT:USER
         CFC_SetForegroundWindow(Win{PROP:Handle})          !поставить на него фокус
         CFC_SetActiveWindow(Win{PROP:Handle})

    Of EVENT:CloseDown
         Break
    Of EVENT:ACCEPTED
         case Accepted()
         of ?Ex
            Break
         of ?Hd
            Win{Prop:Hide} = TRUE
            Win{PROP:Timer} = 1000
         end
    End !Case
  END !ACCEPT
  Close(Win)

  RETURN
!----------------------------------------
SubClassFunc   Function(UnSigned hWnd, UnSigned wMsg, UnSigned wParam, UnSigned lParam) !,LONG,Pascal
WM_QUERYENDSESSION  EQUATE(011h) !запрос системы о согласии приложения завершиться
WM_ENDSESSION       EQUATE(016h) !сообщение системы о своём завершении
WM_WINDOWPOSCHANGED EQUATE(047h) !изменение координат и других параметров окна
ret   Long(0)
sw    &SavedWnd
  Code
    sw &= CFC_GetWindowLong(hWnd, CFC_GWL_USERDATA)
    Case wMsg
    Of WM_QUERYENDSESSION
      ret = 1                 ! я согласен на завершение
    Of WM_ENDSESSION
      POST(EVENT:CloseDown,, sw.Thread)
    ! ret = 0                 ! я получил извещение о завершении
    Of WM_WINDOWPOSCHANGED
      ret = DefWindowProc(hWnd, wMsg, wParam, lParam)
    Else
      ret = CFC_CallWindowProc(sw.WndProc, hWnd, wMsg, wParam, lParam)
    End !Case
  Return (ret)