Как повесить программу в system tray

Предыдущая тема Следующая тема Перейти вниз

Как повесить программу в system tray

Сообщение  electrik в Ср Дек 03, 2008 8:13 pm

короче, я хочу повесить прогу в system tray, хотябы, не всплывающую менюшку, а просто кликнул и тебе диалоговое окно. можно и два примера, с менюшкой и с диалогом. почему диалог, да просто мне надо реализовать некоторые настройки, а прога висит в трее и делает свое дело.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как повесить программу в system tray

Сообщение  DoReMi в Пт Дек 05, 2008 3:15 pm

Shell_NotifyIcon задать в поиске по http://www.freebasic.net/forum/ там есть несколько примеров
avatar
DoReMi

Сообщения : 67
Дата регистрации : 2008-08-28
Возраст : 44
Откуда : Волгодонск

Посмотреть профиль http://doreonline.blogspot.com

Вернуться к началу Перейти вниз

Re: Как повесить программу в system tray

Сообщение  electrik в Вс Мар 22, 2009 12:11 am

ура! я разобрался как при помощи winApi повесить прогу в SystemTray. конечно, все это благодаря example в PowerBasic.
все не так сложно, вобщем держите:

код файла tray.rc:

#include "tray.bi"
popupmenu MENU
BEGIN
POPUP "&MyMenu"
BEGIN
MENUITEM "&О программе",idabout
MENUITEM "&Выход", idexit
END
END

IDD_DLG1 DIALOGEX 0,0,320,170
CAPTION "тест проги с системным треем"
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
FONT 8,"MS Sans Serif"
BEGIN
DEFPUSHBUTTON "&Жми", TestButton, 20, 20, 35, 10
PUSHBUTTON "&Выход", ExitButton, 20, 35, 35, 10
END


код файла tray.bi:

#define IDD_DLG1 1000
#define TestButton 1001
#define ExitButton 1002
#define idabout 1003
#define idexit 1004

код файла tray.bas:



#define WIN_INCLUDEALL
#include"windows.bi"
#include "tray.bi"

#define WM_TRAYICON WM_USER+1

declare Function DlgProc (byval hwnd as HWND, byval umsg as UINT, _
byval wparam as WPARAM, byval lparam as LPARAM) as BOOL

dim shared hRtc as HMODULE 'хэндл программы
hRtc = GetModuleHandle( cPtr(LPCSTR,NULL)) 'получим хэндл программы

'создадим диалоговое окно, с помощью функции DialogBox
'hRtc- хэндл нашей программы
'IDD_DLG1- идентификатор ресурсов (шаблон диалога)
'HWND_DESKTOP- родительское окно, можно использовать NULL
'@DlgProc- указатель на функцию DlgProc
DialogBox(hRtc, cptr( LPCSTR, IDD_DLG1), HWND_DESKTOP , _
@DlgProc)

end
' Program end

'функция DlgProc
'hDlg- хэндл диалога
'umsg- то, от чего получаем сообщения
'wparam lparam- параметры, см. Справочник по сообщениям
Function DlgProc (byval hDlg as HWND, byval umsg as UINT, _
byval wparam as WPARAM, byval lparam as LPARAM) as BOOL

'id- будем использовать как идентификатор кнопок и элементов меню
'event- в этой программе пока не используется
static as long id, event
STATIC hMenu AS HMENU 'хэндл меню
STATIC ti AS NOTIFYICONDATA 'структура параметров нашей иконки в трее
STATIC p AS POINT 'структура, помудрите со значениями x и y
select case uMsg 'начинаем получать всякие сообщения
case WM_INITDIALOG 'инициализация диалога

'получим хэндл меню, и его прогрузим, но не покажем
hMenu = GetSubMenu(LoadMenu(hRtc, "POPUPMENU"), 0)
ti.cbSize = SIZEOF(ti) 'размер этой структуры
ti.hWnd = hDlg 'сюда запишем хэндл диалога
ti.uID=hRtc->i 'ну а сюда хэндл программы
ti.uFlags = NIF_ICON OR NIF_MESSAGE OR NIF_TIP 'какие-то флаги, пока не разобрался
ti.uCallbackMessage = WM_TRAYICON 'сообщение
'ti.hIcon = LoadIcon(hInst, "myicon") 'сюда грузим иконку
ti.szTip = "Ты рад?" 'название нашей проги в systemTray
Shell_NotifyIcon(NIM_ADD, @ti) 'магическая команда, добавляем нашу прогу в tray
'DestroyIcon ti.hIcon 'разрушаем иконку

FUNCTION = 1

CASE WM_TRAYICON 'сообщение если мы вызываем прогу из трея
SELECT CASE LOWORD(lParam) 'получаем сообщения из lParam
CASE WM_LBUTTONDOWN 'если ткнули левой кнопкой крысы
IF IsWindowVisible(hDlg) = FALSE THEN 'если окошко свернуто в трее
ShowWindow(hDlg, SW_SHOW) 'покажем наш диалог
end if

CASE WM_RBUTTONDOWN ' если нажали правую кнопку крысы
IF IsWindowVisible(hDlg) = FALSE THEN 'если окошко свернуто в трее
SetForegroundWindow( hDlg) 'диалог на передний план
GetCursorPos(@p) 'получим позицию курсора
TrackPopupMenu(hMenu, 0, p.x, p.y, 0, hDlg, _
NULL) 'выведем контекстное меню
Postmessage( hDlg, WM_NULL, 0, 0) 'пошлем диалогу сообщение
END IF
END SELECT

CASE WM_DESTROY 'если диалог разрушен
Shell_NotifyIcon(NIM_DELETE, @ti) 'удаляем иконку из системного лотка

' case WM_CLOSE
'EndDialog( hDlg, 0 )

case WM_COMMAND 'юзверь куда-то тыкает, кнопки, меню
id = loword( wParam ) 'возьмем в id, младшее слова из wParam
event = hiword( wParam )

select case id 'начинаем проверять наш идентификатор

case TestButton 'нажали кнопку жми
messagebox(0, _
"попробуй ткнуть alt+f4, и твоя прога свернется. только сейчас нажми ок.", _
"прога которая вешается в systemTray",0)
case idabout 'нажали элемент меню о программе
messagebox(0, _
"При помощи этого эгзэмпла, ты сможешь без труда повесить прогу в SystemTray", _
"О программе",0)

case ExitButton,idexit 'нажали кнопку выход, и в меню выход

endDialog(hDlg,0) 'выходим из диалога

end select

CASE WM_SYSCOMMAND 'если тыкаем из системного меню
SELECT CASE LOWORD(wParam)
CASE SC_MINIMIZE 'нажали свернуть
ShowWindow( hDlg, SW_HIDE) 'спрячем окошко
FUNCTION = 1
EXIT FUNCTION

CASE SC_CLOSE 'если нажали закрыть
ShowWindow(hDlg, SW_HIDE) 'спрячем окошко
FUNCTION = 1
EXIT FUNCTION

END SELECT

case else
return FALSE

end select

return TRUE
end function

незабудьте строку
'ti.hIcon = LoadIcon(hInst, "myicon")
разкоментировать и загрузить свою иконку,
и также разкоментировать эту строку:
'DestroyIcon ti.hIcon
компилировать:
fbc -s gui tray.rc tray.bas

программа работает и без иконки, в трее при наведении мышки отображается название.

обязательно, если где-то как-то не правильно были сформулированы коментарии, поправляйте, чтоб не вводить народ в заблуждение.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как повесить программу в system tray

Сообщение  electrik в Вс Мар 29, 2009 5:00 pm

ну вот, мы повесили прогу в SystemTray, теперь новая задача, как можно сотворить горячую клавишу. когда прога свернута, я хочу нажать например
ctrl+win+S
и прога показывается.
там, вроде, есть какое-то сообщение типа
WM_SYSKEYDOWN
или как-то можно иначе.
конечно, сейчас пороюсь по инету, но вобщем help плиз.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как повесить программу в system tray

Сообщение  Freebasic_ru_admin в Пт Окт 30, 2009 9:18 pm

Такой вопрос, что значит в строках проги:

незабудьте строку
'ti.hIcon = LoadIcon(hInst, "myicon")
разкоментировать и загрузить свою иконку,

фраза: "myicon" - что сюда вставлять? myicon.ico?

Кто знает?

Freebasic_ru_admin

Сообщения : 17
Дата регистрации : 2008-12-15
Откуда : Украина, Донбасс

Посмотреть профиль http://freebasic.ru

Вернуться к началу Перейти вниз

А так, не проще ли??

Сообщение  Freebasic_ru_admin в Пт Окт 30, 2009 9:27 pm

Кстати, а не прощи ле применить следующий код:


#define WIN_INCLUDEALL
#include "windows.bi"
#include "fbgfx.bi"

#define WM_SHELLNOTIFY WM_USER + 1

Declare Function NewWindowProc(As HWND,As Uinteger,wParam As WPARAM,lParam As LPARAM) As LRESULT


Dim As HWND hWin
Dim Shared As WNDPROC OldWindowProc

ScreenRes 640,480,32
WindowTitle "Нажми кнопку свернуть, и смотри в системном трее"
ScreenControl FB.GET_WINDOW_HANDLE,cast(Integer,hWin)
OldWindowProc = cptr(WNDPROC,SetWindowLong(hWin,GWL_WNDPROC,cast(DWORD,@NewWindowProc)))

' Set up our notify icon
Dim Shared As NOTIFYICONDATA NID
With NID
.cbSize = SizeOf (NOTIFYICONDATA)
.hWnd = hWin
.hIcon = LoadIcon (NULL, IDI_QUESTION)
.uFlags = NIF_INFO Or NIF_MESSAGE Or NIF_TIP Or NIF_ICON
.uCallbackMessage = WM_SHELLNOTIFY
.szTip = "Вот наша программка свернулась!"
.szInfoTitle = "Вот эта иконка"
.szInfo = "Красиво, неправда ли?"
End With

Sleep

Function NewWindowProc(Byval hWin As HWND, _
Byval Msg As Uinteger, _
Byval wParam As WPARAM, _
Byval lParam As LPARAM) As LRESULT
Dim As RECT rcWindow,rcTray
Dim As HWND hWndTaskBar,hWndTray

Select Case As Const Msg
Case WM_SYSCOMMAND
If wParam = SC_MINIMIZE Then
' Get the system tray's hWnd
hWndTaskBar = FindWindow("Shell_TrayWnd", NULL)
hWndTray = FindWindowEx(hWndTaskBar, 0, "TrayNotifyWnd", NULL)
' Show the notify icon
Shell_NotifyIcon (NIM_ADD, @NID)
' Animate the window closing to the tray
GetWindowRect hWin, @rcWindow
GetWindowRect hwndTray, @rcTray
DrawAnimatedRects hWin, IDANI_CAPTION, @rcWindow, @rcTray

' Hide the window
ShowWindow(hWin, SW_HIDE)
Return False
End If
Case WM_SHELLNOTIFY
If lParam = WM_LBUTTONDBLCLK Then
' Restore the window
ShowWindow (hWin, SW_SHOWMINIMIZED)
SendMessage(hWin, WM_SYSCOMMAND, SC_RESTORE,0)
Shell_NotifyIcon(NIM_DELETE,@NID)
End If
End Select

Return OldWindowProc(hWin, Msg, wParam, lParam)
End Function

Проще, и не нужно парится с файлами Rolling Eyes

Freebasic_ru_admin

Сообщения : 17
Дата регистрации : 2008-12-15
Откуда : Украина, Донбасс

Посмотреть профиль http://freebasic.ru

Вернуться к началу Перейти вниз

Re: Как повесить программу в system tray

Сообщение  vbman в Вт Ноя 03, 2009 6:35 pm

И еще: если выводите менюшку по правой клавише на иконке в трее, то надо перед выводом делать вызов SetForegroundWindow(свое окно) - это для того, чтобы менюшка не зависала на экране Suspect , требуя выбора любого пункта, ведь эскейпом ее не уберешь Crying or Very sad . Такой глюк изредка, но проявляется. В Виндовсе бывает при правой клавише на панели задач tongue . Если вывести свое окно на передний план, то меню можно будет убрать по эскейпу. Very Happy
avatar
vbman

Сообщения : 52
Дата регистрации : 2008-11-19
Возраст : 36
Откуда : Украина, Кировоград

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как повесить программу в system tray

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения