如何让一个GUI覆盖到任务栏外面?
大家好!想制作一个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 编辑 ] 修改系统文件吧。
回复 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, $MousePos, $WinPos
$MousePos = MouseGetPos()
$WinPos = WinGetPos($title, "")
$PosDiff = $WinPos - $MousePos
$PosDiff = $WinPos - $MousePos
While _IsPressed("01", DllOpen("user32.dll"))
$MousePos = MouseGetPos()
WinMove($title, "", $MousePos + $PosDiff, $MousePos + $PosDiff)
Sleep(10)
WEnd
EndFunc ;==>Move
Func _PRIMARYdown()
Move()
$pos = MouseGetPos()
$guiPos = WinGetPos($AForm1, '')
If ($pos >= $guiPos And $pos <= $guiPos + $guiPos) And _
($pos >= $guiPos And $pos <= $guiPos + $guiPos) 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
:face (30):
不修改系统文件,我觉得是有办法解决的,但是我看不懂代码......... 求求大侠片言只语,那怕是一段代码,一个函数,永生难忘!!!:face (3): :face (3): :face (3): 不修改系统文件。就要用API了。我也没有搞过。有时间我研究下。 汗 WinSetOnTop 不就行了么 楼上的想得太简单了。建议你看下KClock吧。 “WinSetOnTop”............
我不想增加进程,希望尽可能少占内存。我现在开任务管理器,只看到16个进程。
谢谢大侠出手相助!!!继续努力.................... “WinSetOnTop”。。是的,可能是这个函数~ 谢谢楼上的提醒,看到了一点光明,,如果将透明度设为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 好像任务栏被设置成‘在其它窗口的前端’,就会出点麻烦了! 脚本能用,我的也是这么设的,但是发现一个脚本暂停的问题不知道怎么解决 原帖由 sanhen 于 2008-12-26 01:54 发表 http://www.autoitx.com/images/common/back.gif
楼上的想得太简单了。建议你看下KClock吧。
但是确实可以达到要的效果啊
我这里也是设置的 任务栏最前段
但是用setontop后 程序是覆盖住任务栏了
做一个无边框的gui 位置定死在时间上 不是楼主要实现的效果么?
kclock没找到....你是说那个flash时钟? 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 好吧..目前就这样结帖吧!
页:
[1]
2