Как повесить программу в system tray
Участников: 4
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Как повесить программу в system tray
короче, я хочу повесить прогу в system tray, хотябы, не всплывающую менюшку, а просто кликнул и тебе диалоговое окно. можно и два примера, с менюшкой и с диалогом. почему диалог, да просто мне надо реализовать некоторые настройки, а прога висит в трее и делает свое дело.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: Как повесить программу в system tray
Shell_NotifyIcon задать в поиске по http://www.freebasic.net/forum/ там есть несколько примеров
Re: Как повесить программу в system tray
ура! я разобрался как при помощи 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
программа работает и без иконки, в трее при наведении мышки отображается название.
обязательно, если где-то как-то не правильно были сформулированы коментарии, поправляйте, чтоб не вводить народ в заблуждение.
все не так сложно, вобщем держите:
код файла 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
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: Как повесить программу в system tray
ну вот, мы повесили прогу в SystemTray, теперь новая задача, как можно сотворить горячую клавишу. когда прога свернута, я хочу нажать например
ctrl+win+S
и прога показывается.
там, вроде, есть какое-то сообщение типа
WM_SYSKEYDOWN
или как-то можно иначе.
конечно, сейчас пороюсь по инету, но вобщем help плиз.
ctrl+win+S
и прога показывается.
там, вроде, есть какое-то сообщение типа
WM_SYSKEYDOWN
или как-то можно иначе.
конечно, сейчас пороюсь по инету, но вобщем help плиз.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: Как повесить программу в system tray
Такой вопрос, что значит в строках проги:
незабудьте строку
'ti.hIcon = LoadIcon(hInst, "myicon")
разкоментировать и загрузить свою иконку,
фраза: "myicon" - что сюда вставлять? myicon.ico?
Кто знает?
незабудьте строку
'ti.hIcon = LoadIcon(hInst, "myicon")
разкоментировать и загрузить свою иконку,
фраза: "myicon" - что сюда вставлять? myicon.ico?
Кто знает?
А так, не проще ли??
Кстати, а не прощи ле применить следующий код:
Проще, и не нужно парится с файлами
#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
Проще, и не нужно парится с файлами
Re: Как повесить программу в system tray
И еще: если выводите менюшку по правой клавише на иконке в трее, то надо перед выводом делать вызов SetForegroundWindow(свое окно) - это для того, чтобы менюшка не зависала на экране , требуя выбора любого пункта, ведь эскейпом ее не уберешь . Такой глюк изредка, но проявляется. В Виндовсе бывает при правой клавише на панели задач . Если вывести свое окно на передний план, то меню можно будет убрать по эскейпу.
vbman- Сообщения : 52
Дата регистрации : 2008-11-19
Возраст : 42
Откуда : Украина, Кировоград
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|