天之骄子 发表于 2012-11-22 12:02:30

请问这段代码为什么不能显示托盘选项,问题出在什么地方?(已解决)

本帖最后由 天之骄子 于 2012-11-23 08:55 编辑

我写了个窗口,先加入的托盘菜单,运行后可以正常显示托盘菜单。但加入了点窗口最小化隐藏界面,双击托盘后显示界面的代码后,只执行第二次加入的隐藏和双击后打开窗口,但是托盘菜单不显示了,
1.请问这段代码问题出在什么地方?
2.代码在执行“跟随系统启动”后,现在开机时直接打开窗口,但我想开机后只启动托盘,请问该怎么做?
我是菜鸟,请求解决。谢谢了。
这是原来的托盘菜单

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <SliderConstants.au3>
#include <StaticConstants.au3>
#include <StructureConstants.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <ACN_HASH.au3>
#include <Constants.au3>
Opt("TrayMenuMode", 1)
Opt("TrayOnEventMode", 1)
Opt("GUIOnEventMode", 1)
Opt("GUIOnEventMode", 1)
Local $sRegPath = 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
      
$Form1 = GUICreate("窗口", 321, 192, -1, -1, -1, -1, WinGetHandle(AutoItWinGetTitle()))
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
GUISetState(@SW_SHOW)

GUISetOnEvent($GUI_EVENT_CLOSE, "Form1") ;点最小化后,隐藏界面,双击托盘后显示界面开始
GUISetOnEvent($GUI_EVENT_MINIMIZE, "Form1")
TraySetOnEvent($TRAY_EVENT_PRIMARYDOUBLE, "TrayEvent")
While 1
      Sleep(100)
WEnd
Func TrayEvent()
      Switch @TRAY_ID
                Case $TRAY_EVENT_PRIMARYDOUBLE
                        GUISetState(@SW_SHOWNORMAL)
      EndSwitch
EndFunc   ;==>TrayEvent
Func Form1()
      Switch @GUI_CtrlId
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $GUI_EVENT_MINIMIZE
                        GUISetState(@SW_HIDE)
      EndSwitch
EndFunc   ;==>Form1         ;点最小化后,隐藏界面,双击托盘后显示界面结束

$guanyu = TrayCreateItem("关于")   ;托盘菜单源码开始
$fangwen= TrayCreateItem("访问")   
$settingsitem = TrayCreateMenu("跟随系统启动")
$displayitemYes = TrayCreateItem("跟随系统启动", $settingsitem)
$printeritemNo = TrayCreateItem("不随系统启动", $settingsitem)
TrayCreateItem("")
$exit = TrayCreateItem("退出")
TraySetState()

If RegRead($sRegPath, @ScriptName) <> '' Then
      TrayItemSetState($displayitemYes, $TRAY_CHECKED)
Else
      TrayItemSetState($printeritemNo, $TRAY_CHECKED)
EndIf
GUISetState()

While 1
      $nMsg = GUIGetMsg()
      Switch $nMsg
                Case - 3
                        Exit

      EndSwitch

      $msg = TrayGetMsg()
      Select
                Case $msg = $exit
                        Exit
                Case $msg = $displayitemYes
                        RegWrite($sRegPath, @ScriptName, 'REG_SZ', '"' & @ScriptFullPath & '" /AUTO')
                        MsgBox(0, '状态:', '跟随系统启动')
                Case $msg = $printeritemNo
                        RegDelete($sRegPath, @ScriptName)
                        MsgBox(0, '状态:', '不随系统启动')
                                Case $msg = $fangwen
                                                Run("rundll32.exe url.dll,FileProtocolHandler http://hi.baidu.com/zizhuxiaoyuan/blog")
                                Case $msg=$guanyu
                                                MsgBox(64, '关于', @CRLF & "你好,我好,大家好!")                                               
                EndSelect
WEnd       ;托盘菜单源码结束

Func Form1Close()
      Exit
EndFunc   ;==>Form1Close

天之骄子 发表于 2012-11-22 12:50:58

请问放到什么位置?谢谢

xiehuahere 发表于 2012-11-22 12:54:56

回复 3# 天之骄子


While 1
      Sleep(100)
WEnd

童鞋,这就是个死循环,后面的函数啥的除非在这个循环前被注册过了、被调用了,否则是执行不到的。

天之骄子 发表于 2012-11-22 13:35:43

回复 4# xiehuahere

把这段代码删除或把
$guanyu = TrayCreateItem("关于")   ;托盘菜单源码开始
$fangwen= TrayCreateItem("访问")   
$settingsitem = TrayCreateMenu("跟随系统启动")
$displayitemYes = TrayCreateItem("跟随系统启动", $settingsitem)
$printeritemNo = TrayCreateItem("不随系统启动", $settingsitem)
TrayCreateItem("")
放到上边后,虽然显示托盘菜单了,但点击菜单上的选项后,没反应。

天之骄子 发表于 2012-11-22 13:38:57

回复 2# zhao_ming


    谢谢,虽然显示托盘菜单了,但点击菜单上的选项后没反应

xiehuahere 发表于 2012-11-22 15:42:30

回复 5# 天之骄子

原因同4#
你的托盘菜单响应函数放在第一个死循环后。两个while 1死循环,第一个循环出不来,怎么会执行第二个循环呢?

建议对托盘用事件模式 Opt("TrayOnEventMode", 1)
看看TrayItemSetOnEvent的帮助吧~~

天之骄子 发表于 2012-11-22 16:42:16

回复 7# xiehuahere

我仔细看看帮助改改吧,谢谢您!
开机只启动托盘,但不启打开窗口怎么做?

afan 发表于 2012-11-22 18:45:00

回复xiehuahere

我仔细看看帮助改改吧,谢谢您!
开机只启动托盘,但不启打开窗口怎么做?
天之骄子 发表于 2012-11-22 16:42 http://www.autoitx.com/images/common/back.gif#include <GUIConstantsEx.au3>
#include <Constants.au3>

Opt("TrayMenuMode", 1)
Opt("TrayOnEventMode", 1)
Opt("GUIOnEventMode", 1)

Local $sRegPath = 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run'

$Form1 = GUICreate("窗口", 321, 192, -1, -1, -1, -1, WinGetHandle(AutoItWinGetTitle()))
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
If Not $CmdLine Then GUISetState(@SW_SHOW)

GUISetOnEvent($GUI_EVENT_MINIMIZE, "Form1");点最小化后,隐藏界面
TraySetOnEvent($TRAY_EVENT_PRIMARYDOUBLE, "TrayEvent");双击托盘后显示界面开始

$guanyu = TrayCreateItem("关于") ;托盘菜单源码开始
TrayItemSetOnEvent(-1, 'TrayEvent')
$fangwen = TrayCreateItem("访问")
TrayItemSetOnEvent(-1, 'TrayEvent')
$settingsitem = TrayCreateMenu("跟随系统启动")
$displayitemYes = TrayCreateItem("跟随系统启动", $settingsitem)
TrayItemSetOnEvent(-1, 'TrayEvent')
$printeritemNo = TrayCreateItem("不随系统启动", $settingsitem)
TrayItemSetOnEvent(-1, 'TrayEvent')
TrayCreateItem("")
$exit = TrayCreateItem("退出")
TrayItemSetOnEvent(-1, 'TrayEvent')
TraySetState()

If RegRead($sRegPath, @ScriptName) <> '' Then
        TrayItemSetState($displayitemYes, $TRAY_CHECKED)
Else
        TrayItemSetState($printeritemNo, $TRAY_CHECKED)
EndIf

While 1
        Sleep(100)
WEnd

Func TrayEvent()
        Switch @TRAY_ID
                Case $TRAY_EVENT_PRIMARYDOUBLE
                        GUISetState(@SW_SHOWNORMAL)
                Case $displayitemYes
                        ;;;RegWrite($sRegPath, @ScriptName, 'REG_SZ', '"' & @ScriptFullPath & '" /AUTO')
                        MsgBox(0, '状态:', '跟随系统启动')
                Case $printeritemNo
                        ;;;RegDelete($sRegPath, @ScriptName)
                        MsgBox(0, '状态:', '不随系统启动')
                Case $fangwen
                        ;;;Run("rundll32.exe url.dll,FileProtocolHandler http://hi.baidu.com/zizhuxiaoyuan/blog")
                Case $guanyu
                        MsgBox(64, '关于', @CRLF & "你好,我好,大家好!")
                Case $exit
                        Exit
        EndSwitch
EndFunc   ;==>TrayEvent

Func Form1()
        Switch @GUI_CtrlId
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $GUI_EVENT_MINIMIZE
                        GUISetState(@SW_HIDE)
        EndSwitch
EndFunc   ;==>Form1

Func Form1Close()
        Exit
EndFunc   ;==>Form1Close

天之骄子 发表于 2012-11-22 18:54:27

本帖最后由 天之骄子 于 2012-11-22 18:58 编辑

回复 9# afan

谢谢afan 超级版主,试了试可以了,呵呵,真实太感谢了!
页: [1]
查看完整版本: 请问这段代码为什么不能显示托盘选项,问题出在什么地方?(已解决)