xinda 发表于 2008-12-25 21:03:11

如何让一个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 编辑 ]

sanhen 发表于 2008-12-25 21:04:44

修改系统文件吧。

xinda 发表于 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, $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):

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

xinda 发表于 2008-12-25 21:44:39

求求大侠片言只语,那怕是一段代码,一个函数,永生难忘!!!:face (3): :face (3): :face (3):

sanhen 发表于 2008-12-25 23:10:50

不修改系统文件。就要用API了。我也没有搞过。有时间我研究下。

sxd 发表于 2008-12-26 00:33:28

汗 WinSetOnTop 不就行了么

sanhen 发表于 2008-12-26 01:54:32

楼上的想得太简单了。建议你看下KClock吧。

xinda 发表于 2008-12-26 09:25:39

“WinSetOnTop”............
我不想增加进程,希望尽可能少占内存。我现在开任务管理器,只看到16个进程。
谢谢大侠出手相助!!!继续努力....................

xinda 发表于 2008-12-26 09:35:05

“WinSetOnTop”。。是的,可能是这个函数~

xinda 发表于 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

liongodmien 发表于 2008-12-26 11:17:15

好像任务栏被设置成‘在其它窗口的前端’,就会出点麻烦了!

xinda 发表于 2008-12-26 11:32:21

脚本能用,我的也是这么设的,但是发现一个脚本暂停的问题不知道怎么解决

sxd 发表于 2008-12-26 23:16:17

原帖由 sanhen 于 2008-12-26 01:54 发表 http://www.autoitx.com/images/common/back.gif
楼上的想得太简单了。建议你看下KClock吧。


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

kclock没找到....你是说那个flash时钟?

xinda 发表于 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

xinda 发表于 2008-12-27 00:12:04

好吧..目前就这样结帖吧!
页: [1] 2
查看完整版本: 如何让一个GUI覆盖到任务栏外面?