当前位置:编程学习 > VB >>

请教系统托盘里的时间显示格式如何更改?

请问VB调用API函数可以修改系统托盘里时间显示格式么?
详情:系统托盘里可以显示长时间格式,但是要把任务栏拉高才能全部显示。有什么办法可以把时间信息重新组合,能不用拉高任务栏就可以显示全部时间信息。像图中显示的
而不是系统显示的 系统托盘时间格式 api vb --------------------编程问答-------------------- --------------------编程问答-------------------- 楼主你那个tyaywnd变量名写错了,当然找不到了,你的模块顶部大概没加
Option Explicit
吧,这样调试很麻烦的。
而且你FindWindowEx的第2个参数类型明显都没对上。建议你还是先分别找这些API的示例来学习下,再弄这种API组合使用的东西。 --------------------编程问答-------------------- 这是我能执行的代码。TrayClockWClass的句柄都取到了怎么还会参数类型都不对上,对不上都报错了呀。 --------------------编程问答-------------------- FindWindowEx第二个参数明先生long型,string型竟然还能运行,挺牛啊。。。 --------------------编程问答--------------------
引用 3 楼 sand_sy 的回复:
这是我能执行的代码。TrayClockWClass的句柄都取到了怎么还会参数类型都不对上,对不上都报错了呀。

你的代码能执行才怪,楼主真固执……

废话不说了,你那个函数我给你修正贴出来,这样可以读取到系统托盘的时间了:
Public Function GetHwnd() As Long
   Dim TrayWnd As Long
   Dim NotifyWnd As Long
   'Dim ClockWnd As Long
   TrayWnd = FindWindow("Shell_TrayWnd", vbNullString)
   NotifyWnd = FindWindowEx(TrayWnd, 0, "TrayNotifyWnd", "")
   'ClockWnd = FindWindowEx(NotifyWnd, 0, "TrayClockWClass", "")
   'GetHwnd = ClockWnd
   GetHwnd = FindWindowEx(NotifyWnd, 0, "TrayClockWClass", vbNullString)
End Function
--------------------编程问答-------------------- 你的 GetWinText() 中两次调用 GetHwnd() ,何必呢……
要是GetHwnd()是一个比较复杂的操作过程,你的代码岂不是严重影响运行速度?

这种情况应该是定义一个Long类型的局部变量,用它保存GetHwnd()的值。
然后用这个局部变量来进行判断及参数传递。 --------------------编程问答-------------------- 另外就说楼主的提问了。
你想要改它的显示样式为‘你想要的那种’,不是什么设置啊、API啊之类的就能搞定的。
这是操作系统它固定了那几种显示格式。
要达到你的要求,恐怕只有你自己不停地‘画’。
(我认为稍微方便点的就是自己弄个窗体去覆盖掉它,在自己的窗口中输出想要显示的内容,很容易。)
--------------------编程问答-------------------- 好久没来了,居然有人回复,太感谢大家了。
回来继续研究。
祝大家新年快乐,万事如意。 --------------------编程问答--------------------
引用 7 楼 Chen8013 的回复:
另外就说楼主的提问了。
你想要改它的显示样式为‘你想要的那种’,不是什么设置啊、API啊之类的就能搞定的。
这是操作系统它固定了那几种显示格式。
要达到你的要求,恐怕只有你自己不停地‘画’。
(我认为稍微方便点的就是自己弄个窗体去覆盖掉它,在自己的窗口中输出想要显示的内容,很容易。)

这种时钟显示应该不大可能自己不停的画窗体吧,那得占多大资源啊。
我只是看到别人这么做,不知道是怎么实现的。 --------------------编程问答-------------------- 我也想让他不拉高就显示周几, --------------------编程问答-------------------- 进控制面板,区域语言,修改日期格式就行。 --------------------编程问答-------------------- [HKEY_CURRENT_USER\Control Panel\International]
"sLongDate"="yyyy'年'M'月'd'日' dddd"
"sShortDate"="yyyy-MM-dd"
"sTimeFormat"="HH:mm:ss"
--------------------编程问答--------------------
引用 12 楼 zhao4zhong1 的回复:
[HKEY_CURRENT_USER\Control Panel\International]
"sLongDate"="yyyy'年'M'月'd'日' dddd"
"sShortDate"="yyyy-MM-dd"
"sTimeFormat"="HH:mm:ss"

这个只能显示单行的呀 --------------------编程问答--------------------

'添加托盘图标
Public Sub AddTrayIocn(Frm As Form, mnu As Menu, Optional tip As String = "", Optional strTitle As String = "", Optional strInfo As String = "")
    Set TheForm = Frm
    Set TheMenu = mnu
    
    OldWindowProc = SetWindowLong(Frm.hwnd, GWL_WNDPROC, AddressOf NewWindowProc)

    With TheData
        .uId = 0
        .hwnd = Frm.hwnd
        .cbSize = Len(TheData)
        .hIcon = Frm.Icon.Handle
        .uCallBackMessage = TRAY_CALLBACK
        .cbSize = Len(TheData)
        .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
        .szTip = tip & vbNullChar
    End With

    Shell_NotifyIcon NIM_ADD, TheData
End Sub

SetWindowLong相当于给本程序添加了一个监听入口,Shell_NotifyIcon NIM_ADD, TheData中给定了响应消息为TRAY_CALLBACK,也就是说系统监听到有TRAY_CALLBACK消息的时候要交给本程序处理,那么时间区域的响应消息是什么呢?
是不是只要我拦截到这个消息,就能在时间区域做单击,右击处理呢?
等回复。。。 --------------------编程问答-------------------- 有两种方法,第一是自己弄个无标题窗口,把TrayClock替换掉。
第二种方法是DLL注入,然后自己重新画TrayClock。 --------------------编程问答--------------------
引用 15 楼 stc_XC 的回复:
有两种方法,第一是自己弄个无标题窗口,把TrayClock替换掉。
第二种方法是DLL注入,然后自己重新画TrayClock。

第二种方法好,没准还能加上当前天气图片当背景呢!做好了发我一份zhao4zhong1@163.com
补充:VB ,  API
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,