VC中怎样建立一个只有系统托盘的程序

VC中怎样建立一个只有系统托盘的程序,第1张

不建窗口无法实现托盘消息的处理,随便建个窗口,隐藏了不就行了?

#define WM_NOTIFYICON (WM_USER+1)

#define IDM_SHOWMAIN 8577//托盘右键菜单的打开主界面选项

#define IDM_EXIT 24876//托盘右键菜单的退出选项

HMENU hpopupmenu;

NOTIFYICONDATA notifyicondata;

hpopupmenu=CreatePopupMenu();//创建一个d出式菜单

//增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已隐藏),将程序结束。

AppendMenu(hpopupmenu,MF_STRING,IDM_SHOWMAIN,TEXT("打开主界面"));

AppendMenu(hpopupmenu,MF_STRING,IDM_EXIT,TEXT("关闭"));

notifyicondatacbSize=sizeof(NOTIFYICONDATA);

notifyicondatauFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;//旗标NIF_ICON使hIcon成员有效,NIF_MESSAGE使uCallbackMessage成员有效,NIF_TIP使szTip成员有效

notifyicondatahIcon=LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON));//拖盘图标

notifyicondatahWnd=hwnd;//接收通知消息的窗口

strcpy(notifyicondataszTip,TEXT("鼠标悬停在托盘图标上的提示信息"));

notifyicondatauCallbackMessage=WM_NOTIFYICON;//自定义通知消息的ID

notifyicondatauID=104;//任务栏图标的ID,作为通知消息的wParam发送

Shell_NotifyIcon(NIM_ADD,&notifyicondata);

Form1 的VB代码

Private bIsQuit As Boolean

Private Sub Form_Load()

  bIsQuit = False

End Sub

Private Sub Form_Unload(Cancel As Integer)

  If Not bIsQuit Then

    Dim rc As Long

    Dim OwnerhWnd As Long

    ' 让窗体不可见

    MeVisible = False

    ' 从任务管理器列表中移除

    OwnerhWnd = GetWindow(MeHWnd, GW_OWNER)

    rc = ShowWindow(OwnerhWnd, SW_HIDE)

    Call Icon_Add(Form1, Metopmenu, MeTimer1, MeHWnd, "ICON Test", MeIcon, 0)

    Cancel = 1

  Else

    Cancel = 0

  End If

End Sub

Private Sub mnuQuit_Click()

  bIsQuit = True

  Call Icon_Del(MeHWnd, 0) '删除通知栏图标

  Unload Me

End Sub

Private Sub mnuShow_Click()

  Call Icon_Del(MeHWnd, 0) '删除通知栏图标

  MeShow '调出窗口

  MeWindowState = 0

End Sub

Private Sub Timer1_Timer()

  Call CommonprocesSD

End Sub

Common模块代码

'Window消息处理函数,目的是: 窗口最小化到托盘时,程序自己处理消息

Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal HWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal HWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal HWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

'点击X时,最小化到托盘

Public Const SW_HIDE = 0

Public Const GW_OWNER = 4

Declare Function GetWindow Lib "user32" (ByVal HWnd As Long, ByVal wCmd As Long) As Long

Declare Function ShowWindow Lib "user32" (ByVal HWnd As Long, ByVal nCmdShow As Long) As Long

'添加、删除、更改托盘图标 Windows API

Declare Function Shell_NotifyIcon Lib "shell32dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long

Public Const DefaultIconIndex = 1 '图标缺省索引

Public Const WM_LBUTTONDOWN = &H201 '按鼠标左键

Public Const WM_RBUTTONDOWN = &H204 '按鼠标右键

Public Const WM_LBUTTONDBLCLK = &H203 '双击左键

Public Const WM_USER = &H400

Public Const TRAY_CALLBACK = (WM_USER + 1001&)

Public Const GWL_WNDPROC = (-4)

Public Const NIM_ADD = 0 '添加图标

Public Const NIM_MODIFY = 1 '修改图标

Public Const NIM_DELETE = 2 '删除图标

Public Const NIF_MESSAGE = 1 'message 有效

Public Const NIF_ICON = 2 '图标 *** 作(添加、修改、删除)有效

Public Const NIF_TIP = 4 'ToolTip(提示)有效

Type NOTIFYICONDATA

    cbSize As Long               '需填入NOTIFYICONDATA数据结构的长度

    HWnd As Long                 '设置成窗口的句柄

    Uid As Long                  '为图标所设置的ID值

    UFlags As Long               '设置uCallbackMessage,hIcon,szTip是否有效

    UCallbackMessage As Long     '消息编号

    hIcon As Long                '显示在状态栏上的图标

    SzTip As String  64         '提示信息

End Type

'声明上述类型的对象

Private IconVa As NOTIFYICONDATA

'声明获取处理Windows 消息前的window句柄

Public OldWindowProc As Long

'判断单击,双击的两个标志

Private bIsSingle As Boolean

Private bIsDouble As Boolean

'声明主窗体,右键菜单和时钟,这里的时钟是为了区分单双击左键,显得比较笨拙

Private frmMain As Form

Private topmenu As Menu

Private timMain As Timer

'函数定义

'添加图标至通知栏

Public Function Icon_Add(frmParent As Form, mnuParent As Menu, timParent As Timer, iHwnd As Long, sTips As String, hIcon As Long, IconID As Long) As Long

  '参数说明:iHwnd:窗口句柄,sTips:当鼠标移到通知栏图标上时显示的提示内容

  'hIcon:图标句柄,IconID:图标Id号

  

  '初始化控件成员

  Set frmMain = frmParent

  Set topmenu = mnuParent

  Set timMain = timParent

  

  With IconVa

    HWnd = iHwnd

    SzTip = sTips + Chr$(0)

    hIcon = hIcon

    Uid = IconID

    UCallbackMessage = TRAY_CALLBACK

    cbSize = Len(IconVa)

    UFlags = NIF_MESSAGE Or NIF_ICON Or NIF_TIP

  End With

  

  

  '获得让程序处理事件的权利

  OldWindowProc = SetWindowLong(iHwnd, GWL_WNDPROC, AddressOf NewWindowProc)

  

  '初始化单双击的判别标志

  bIsSingle = False

  bIsDouble = False

  

  '初始化时钟

  timMainEnabled = True

  timMainInterval = 500

  

  Icon_Add = Shell_NotifyIcon(NIM_ADD, IconVa)

End Function

'删除通知栏图标(参数说明同Icon_Add)

Function Icon_Del(iHwnd As Long, lIndex As Long) As Long

  Dim IconVa As NOTIFYICONDATA

  Dim L As Long

  With IconVa

    HWnd = iHwnd

    Uid = lIndex

    cbSize = Len(IconVa)

  End With

  

  '当图标从托盘删除后,关闭时钟,不在监视单双击事件

  timMainEnabled = True

  

  '让 *** 作系统处理消息

  SetWindowLong iHwnd, GWL_WNDPROC, OldWindowProc

  

  Icon_Del = Shell_NotifyIcon(NIM_DELETE, IconVa)

End Function

'修改通知栏图标(参数说明同Icon_Add)

Public Function Icon_Modify(iHwnd As Long, sTips As String, hIcon As Long, IconID As Long) As Long

  Dim IconVa As NOTIFYICONDATA

  With IconVa

    HWnd = iHwnd

    SzTip = sTips + Chr$(0)

    hIcon = hIcon

    Uid = IconID

    UCallbackMessage = TRAY_CALLBACK

    cbSize = Len(IconVa)

    UFlags = NIF_MESSAGE Or NIF_ICON Or NIF_TIP

    

  End With

  

  Icon_Modify = Shell_NotifyIcon(NIM_MODIFY, IconVa)

End Function

'程序处理Windows传递的消息

Public Static Function NewWindowProc(ByVal HWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

  

  '如果用户点击了托盘中的图标,则进行判断是点击了左键单双击,还是右键

  If Msg = TRAY_CALLBACK Then

    '如果点击了右键

    If lParam = WM_RBUTTONDOWN Then

      '则d出右键菜单

      frmMainPopupMenu topmenu

      Exit Function

    End If

    

    '如果双击左键

    If lParam = WM_LBUTTONDBLCLK Then

      bIsDouble = True

      bIsSingle = False

      Exit Function

    End If

  

    '如果点击了左键

    If lParam = WM_LBUTTONDOWN Then

      bIsSingle = True

      bIsDouble = False

      Exit Function

    End If

  End If

  '如果是其他类型的消息则传递给原有默认的窗口函数

  NewWindowProc = CallWindowProc(OldWindowProc, HWnd, Msg, wParam, lParam)

End Function

'被时钟调用,来区分单击,还是双击,以及事件处理内容

Public Sub procesSD()

  '如果是双击,就恢复窗口,并把图标从托盘删除

  If bIsDouble Then

    Call Icon_Del(frmMainHWnd, 0) '删除通知栏图标

    frmMainShow '调出窗口

    frmMainWindowState = 0

    frmMainSetFocus

  ElseIf bIsSingle Then

    '如果是单击,就d出左键菜单

    frmMainPopupMenu topmenu

  End If

  

  '恢复单双击判断的标志

  bIsSingle = False

  bIsDouble = False

End Sub

加个,名字改成:图标(自己可以定)

在启动窗口的第一行代码写上:置托盘图标(#图标,“图标”)

#图标是你自己定的

“图标”是鼠标到那个地方d出的语句。

如果不懂,源码请看:

>

版本 2

子程序 _后台运行_被选择

可视 = 假

置托盘图标 (_启动窗口图标, “网关服务”)

子程序 __启动窗口_托盘事件

参数 *** 作类型, 整数型

如果 ( *** 作类型 = 2)

可视 = 真

位置 = 0

置托盘图标 (, )

否则

thisHide();

不是关闭是隐藏

昨天碰到某个提问者提的问题 我没有回答,今天在这里说下

如何在任务栏中部显示而在进程中显示那么就可以使用hide方法

ApplicationExit();//释放所有资源

改成:

ApplicationExitThread();

以上就是关于VC中怎样建立一个只有系统托盘的程序全部的内容,包括:VC中怎样建立一个只有系统托盘的程序、vb 托盘程序、易语言怎么让程序自动托盘等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/zz/10066928.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存