找回密码
 加入
搜索
查看: 4306|回复: 20

如何让一个GUI覆盖到任务栏外面?

[复制链接]
发表于 2008-12-25 21:03:11 | 显示全部楼层 |阅读模式
大家好!
想制作一个GUI,覆盖到系统托盘的时间区,以代替鼠标双击时间的响应事件,使鼠标双击时间的时候不是打开“日期和时间 属性”而是打开C:\MyTimedatea.exe这个程序。遇到几个问题无法解决;
1:试图将窗体覆盖到任务栏时失败,从图中可以看到窗体被任务栏覆盖了。
2:能不能在这个窗口中使用透明背景?能不能在上面重新显示时间?
3:鼠标双击的时候怎么打开C:\MyTimedatea.exe
     右键“程序1”的时候怎么打开C:\程序1.exe;右键“程序2”的时候............
------------我的桌面设置是1024X768分辩率--------------
#NoTrayIcon
#include<GUIConstants.au3>
#include<WindowsConstants.au3>

GUICreate("",70,30,950,720,$WS_POPUP,$WS_EX_TOOLWINDOW)
GUISetState(@SW_SHOW)

$contextmenu = GUICtrlCreateContextMenu ()
$Open_a      = GUICtrlCreateMenuitem ("程序1", $contextmenu)
$Open_b      = GUICtrlCreateMenuitem ("程序2", $contextmenu)
$Open_c      = GUICtrlCreateMenuitem ("程序3", $contextmenu)
$Open_d      = GUICtrlCreateMenuitem ("",      $contextmenu)
$OptionsExit = GUICtrlCreateMenuItem ("退出",  $contextmenu)
GUISetState ()

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case $OptionsExit, $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch   
WEnd
Exit
[ 本帖最后由 xinda 于 2008-12-27 00:04 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2008-12-25 21:04:44 | 显示全部楼层
修改系统文件吧。
 楼主| 发表于 2008-12-25 21:25:55 | 显示全部楼层

回复 2# sanhen 的帖子

#Include <Misc.au3>
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Global $start
Global $n = 0
Global $pos
Global $clickspeed = RegRead("HKEY_CURRENT_USER\Control Panel\Mouse", "DoubleClickSpeed")
Opt("GUIOnEventMode", 1)
$title = "mygui"
$title2="悬浮窗演示"
$AForm1 = GUICreate($title, 38, 38, 750, 100, BitOR($WS_SYSMENU, $WS_POPUP, $WS_POPUPWINDOW, $WS_BORDER), $WS_EX_TOOLWINDOW)
GUISetOnEvent($GUI_EVENT_CLOSE, "_exit", $AForm1)
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_PRIMARYdown', $AForm1)
GUISetOnEvent($GUI_EVENT_PRIMARYUP, '_PRIMARYup', $AForm1)
GUISetBkColor(0xBFDBFF)
$icon = GUICtrlCreateIcon(@WindowsDir & "\cursors\horse.ani", -1, 3, 3)
GUICtrlSetState(-1, $GUI_DISABLE)

$Rm = GUICtrlCreateContextMenu()
$title3 = GUICtrlCreateMenuItem("打开/隐藏主窗口", $Rm)
GUICtrlSetOnEvent(-1, "showhidemain")
GUICtrlCreateMenuItem("", $Rm)
$Help = GUICtrlCreateMenuItem("关于", $Rm)
GUICtrlSetOnEvent(-1, "about")
GUICtrlCreateMenuItem("", $Rm)
$exit = GUICtrlCreateMenuItem("退出", $Rm)
GUICtrlSetOnEvent(-1, "_exit")

$AForm2 = GUICreate($title2, 400, 300, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "showhidemain", $AForm2)
$label1 = GUICtrlCreateLabel("这是主程序窗口", 50, 100)
GUISetState(@SW_SHOW, $AForm1)

WinSetOnTop($AForm1, "", 1)
WinSetTrans($AForm1, "", 200)
While 1
    Sleep(100)
WEnd

Func _exit()
    GUIDelete()
    Exit
EndFunc   ;==>_exit

Func about()
    MsgBox(262144, "关于:", "这是一个关于悬浮窗的演示程序。" & @CRLF & @CRLF & "     By Pcbar 2007.09.21")
EndFunc   ;==>about

Func Move()
    Dim $PosDiff[2], $MousePos, $WinPos
    $MousePos = MouseGetPos()
    $WinPos = WinGetPos($title, "")
    $PosDiff[0] = $WinPos[0] - $MousePos[0]
    $PosDiff[1] = $WinPos[1] - $MousePos[1]
    While _IsPressed("01", DllOpen("user32.dll"))
        $MousePos = MouseGetPos()
        WinMove($title, "", $MousePos[0] + $PosDiff[0], $MousePos[1] + $PosDiff[1])
        Sleep(10)
    WEnd
EndFunc   ;==>Move
Func _PRIMARYdown()
    Move()
    $pos = MouseGetPos()
    $guiPos = WinGetPos($AForm1, '')
    If ($pos[0] >= $guiPos[0] And $pos[0] <= $guiPos[0] + $guiPos[2]) And _
            ($pos[1] >= $guiPos[1] And $pos[1] <= $guiPos[1] + $guiPos[3]) Then
        $n += 1
        If $n = 2 And (TimerDiff($start) < $clickspeed) Then
            ShowHidemain()
        Else
            $start = TimerInit()
            $n = 1
        EndIf
    EndIf
EndFunc   ;==>_PRIMARYdown
Func _PRIMARYup()
    If $n = 2 Then
        $n = 0
    Else
        $start = TimerInit()
    EndIf
EndFunc   ;==>_PRIMARYup
 
Func ShowHidemain()
    If _WinIsVisible($AForm2) Then
        GUISetState(@SW_HIDE,$AForm2)
    Else
        GUISetState(@SW_SHOW,$AForm2)
        if BitAND(WinGetState($title2,""),16) then WinSetState($title2,"",@SW_RESTORE)
        WinActivate($AForm2)
    EndIf
EndFunc

Func _WinIsVisible($hWnd, $Text="")
    Return BitAND(WinGetState($hWnd, $Text), 2)
EndFunc


不修改系统文件,我觉得是有办法解决的,但是我看不懂代码.........

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2008-12-25 21:44:39 | 显示全部楼层
求求大侠片言只语,那怕是一段代码,一个函数,永生难忘!!!
发表于 2008-12-25 23:10:50 | 显示全部楼层
不修改系统文件。就要用API了。我也没有搞过。有时间我研究下。
发表于 2008-12-26 00:33:28 | 显示全部楼层
汗 WinSetOnTop 不就行了么

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2008-12-26 01:54:32 | 显示全部楼层
楼上的想得太简单了。建议你看下KClock吧。
 楼主| 发表于 2008-12-26 09:25:39 | 显示全部楼层
“WinSetOnTop”............
我不想增加进程,希望尽可能少占内存。我现在开任务管理器,只看到16个进程。
谢谢大侠出手相助!!!继续努力....................
 楼主| 发表于 2008-12-26 09:35:05 | 显示全部楼层
“WinSetOnTop”。。是的,可能是这个函数~
 楼主| 发表于 2008-12-26 11:05:36 | 显示全部楼层
谢谢楼上的提醒,看到了一点光明,,如果将透明度设为1的话“WinSetTrans($Win, "", 1)”会很有意思的,但是不能设0
现在的问题是怎么在鼠标双击的时候怎么打开C:\MyTimedatea.exe
其它问题再慢~解决..................
#include<GUIConstants.au3>

$Win = GUICreate("",40,30,980,737,$WS_POPUP,$WS_EX_TOOLWINDOW)
GUISetState(@SW_SHOW, $Win)
WinSetOnTop($Win, "", 1)
WinSetTrans($Win, "", 255)

While 1
    Sleep(100)
WEnd
发表于 2008-12-26 11:17:15 | 显示全部楼层
好像任务栏被设置成‘在其它窗口的前端’,就会出点麻烦了!
 楼主| 发表于 2008-12-26 11:32:21 | 显示全部楼层
脚本能用,我的也是这么设的,但是发现一个脚本暂停的问题不知道怎么解决

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2008-12-26 23:16:17 | 显示全部楼层
原帖由 sanhen 于 2008-12-26 01:54 发表
楼上的想得太简单了。建议你看下KClock吧。



但是确实可以达到要的效果啊
我这里也是设置的 任务栏最前段
但是用setontop后 程序是覆盖住任务栏了
做一个无边框的gui 位置定死在时间上 不是楼主要实现的效果么?

kclock没找到....你是说那个flash时钟?
 楼主| 发表于 2008-12-27 00:00:47 | 显示全部楼层
KClock是个好东西,如果有可能,我会把鱼鱼桌面都去掉。。
基本的代码就这样,但是目前还在整理中,我想那里还会有个漂亮的LCO的。。。好。。
谢谢各位了!!!好!非常满意..
#NoTrayIcon
#include

$Win = GUICreate("",40,30,980,737,$WS_POPUP,$WS_EX_TOOLWINDOW)
GUISetState(@SW_SHOW, $Win)
WinSetOnTop($Win, "", 1)
WinSetTrans($Win, "", 1)

$Right = GUICtrlCreateContextMenu()
$Opena = GUICtrlCreateMenuitem ("日期", $Right)
$Openb = GUICtrlCreateMenuitem ("音量调整", $Right)
$Openc = GUICtrlCreateMenuitem ("输入法", $Right)
$Opend = GUICtrlCreateMenuitem ("", $Right)
$Exit = GUICtrlCreateMenuItem ("退出", $Right)

While 1
$Msg = GUIGetMsg()
Switch $Msg
Case $Opena
Run ("..\USER\MyDate.exe")
Case $Openb
RunWait ("sndvol32.exe")
Case $Openc
Run ("Control.exe intl.cpl")
Case $Exit
ExitLoop
EndSwitch
WEnd
 楼主| 发表于 2008-12-27 00:12:04 | 显示全部楼层
好吧..目前就这样结帖吧!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-18 23:46 , Processed in 0.081558 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表