Есть программа которая при сканировании штрихкода должна подняться из таскбара.
Этот пример сделан для теста.
Пробовал сотню разных вариантов поднятия программы но ни один нормально не работает...
Остановился на текущем... с момощь StayOnTop окна поднимаем прогу. Но фокус остается черт знает где...
Программу могут свернуть по Win+В, переключиться с нее с помощью Alt+Tab (могут и в DOS FullScreen режим.)
В любом случае она должна вверх подыматься..
Кто сможет помочь?
Заранее благодарю!
Поднятие приложения из таскбара
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Поднятие приложения из таскбара
- Вложения
-
- test.zip
- тест на поднятие задачи из таскбара
- (79.73 КБ) 174 скачивания
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: Поднятие приложения из таскбара
Так не годится?
(ну с добавлением CFC_)
А для оnработки окном SetWindowPos нужен, если не ошибаюсь, сабклассинг с обработкой события винды WM_WINDOWPOSCHANGED
return ( DefWindowProcA(hWnd, wMsg, wParam, lParam) )
Код: Выделить всё
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)
А для оnработки окном SetWindowPos нужен, если не ошибаюсь, сабклассинг с обработкой события винды WM_WINDOWPOSCHANGED
return ( DefWindowProcA(hWnd, wMsg, wParam, lParam) )
Компьютер имеет то преимущество перед мозгом, что им пользуются...
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: Поднятие приложения из таскбара
ВСЕГДА НАВЕРХУ ЧЕРЕЗ 10 СЕКУНД - ДО НАЖАТИЯ НА КНОПКУ:
<СКРЫТЬ> - снова таймер на 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)
Компьютер имеет то преимущество перед мозгом, что им пользуются...