monte Posted March 2, 2007 Posted March 2, 2007 Hello, I'm in the middle of creating a taskbar replacement for windows and am lost on how to test for a window losing focus. I've tried adlibenable and an if (in main()) with no luck (see commented lines). Any thoughts? CODE#include <GUIConstants.au3> #include <Date.au3> adlibenable("clockTimer", 100) ;adlibenable("goMenuTimer", 100) $g_szVersion = "xpSkin" If WinExists($g_szVersion) Then Exit AutoItWinSetTitle($g_szVersion) HotKeySet("{ESC}", "quit") ;create gui $xpSkin = guicreate ("xpSkin", @desktopwidth / 4 * 3, @desktopheight/38.4, -1, @desktopheight - 25, BitOr($WS_POPUP,$WS_DLGFRAME,$WS_EX_TOOLWINDOW)) GUISetBkColor(0x000000) $goButton = GUICtrlCreateLabel ("Go", 3, 3, 25) GUICtrlSetBkColor($goButton, 0x000000) GUICtrlSetColor($goButton, 0x00ff00) $clockPos = controlgetpos("xpSkin", "", $xpSkin) $clock = guictrlcreatelabel ("", $clockPos[2] - 50, -1 + 5, BitOr($SS_SIMPLE,$SS_SUNKEN)) $datePos = controlgetpos("", "", $clock) GUICtrlSetTip($clock, _DateTimeFormat( _NowCalc(),1)) ;, $datePos[0] - 5, $datePos[1] - 5) GUICtrlSetColor ($clock, 0x00ff00) ;main() ControlHide ( "ClassName=Progman", "FolderView", "SysListView321") ControlHide ( "ClassName=Shell_TrayWnd", "", "TrayClockWClass1") ControlHide ( "ClassName=Shell_TrayWnd", "", "Button1") ControlHide ( "ClassName=Shell_TrayWnd", "", "Button2") ControlHide ( "ClassName=Shell_TrayWnd", "", "ToolbarWindow321") ControlHide ( "ClassName=Shell_TrayWnd", "", "ToolbarWindow322") ControlHide ( "ClassName=Shell_TrayWnd", "", "") ;display dialog on top of all windows GUISetState (@SW_SHOW, $xpSkin) winsetontop ("xpSkin", "", 1) While 1 $msg = GUIGetMsg() Select Case $msg = $goButton GoMenu() EndSelect ;if NOT winactive("GoMenu") then ;GUIDelete($goMenu) ;GUISetState(@SW_ENABLE, $xpSkin) ;endif sleep (1) WEnd func clockTimer() GUICtrlSetData($clock, @HOUR & ":" & @MIN & ":" & @SEC) endfunc Func GoMenu() GUISetState(@SW_DISABLE, $xpSkin) $goMenu = guicreate ("GoMenu", 200, 500, (@desktopwidth/4)/2 - 2, @desktopheight/3.2, BitOr($WS_POPUP,$WS_DLGFRAME,$WS_EX_TOOLWINDOW)) GUISetBkColor(0x000000) GUISetState (@SW_SHOW, $goMenu) guiswitch($goMenu) sleep(3000) GUIDelete($goMenu) GUISetState(@SW_ENABLE, $xpSkin) endFunc func goMenuTimer() if NOT winactive("GoMenu") then ;GUIDelete($goMenu) ;GUISetState(@SW_ENABLE, $xpSkin) endif endfunc Func quit() Controlshow ( "ClassName=Shell_TrayWnd", "", "") Controlshow ( "ClassName=Shell_TrayWnd", "", "TrayClockWClass1") Controlshow ( "ClassName=Shell_TrayWnd", "", "Button1") Controlshow ( "ClassName=Shell_TrayWnd", "", "Button2") Controlshow ( "ClassName=Shell_TrayWnd", "", "ToolbarWindow321") Controlshow ( "ClassName=Shell_TrayWnd", "", "ToolbarWindow322") Controlshow ( "ClassName=Progman", "", "SysListView321") exit EndFunc
monte Posted March 2, 2007 Author Posted March 2, 2007 note, to exit and restore your windows taskbar just press esc.
Moderators SmOke_N Posted March 2, 2007 Moderators Posted March 2, 2007 (edited) Your post is kind of confusing, the title says "control" yet the post says "window", so I went off the code and took a guess this is what you are looking for, I marked what I did or added with ;######################CODEexpandcollapse popup#include <GUIConstants.au3> #include <Date.au3> Global Const $WM_ACTIVATEAPP = 0x01C;###################### AdlibEnable("clockTimer", 100) ;adlibenable("goMenuTimer", 100) $g_szVersion = "xpSkin" If WinExists($g_szVersion) Then Exit AutoItWinSetTitle($g_szVersion) HotKeySet("{ESC}", "quit") ;create gui $xpSkin = GUICreate("xpSkin", @DesktopWidth / 4 * 3, @DesktopHeight / 38.4, -1, @DesktopHeight - 25, BitOR($WS_POPUP, $WS_DLGFRAME, $WS_EX_TOOLWINDOW)) GUISetBkColor(0x000000) $goButton = GUICtrlCreateLabel("Go", 3, 3, 25) GUICtrlSetBkColor($goButton, 0x000000) GUICtrlSetColor($goButton, 0x00ff00) $clockPos = ControlGetPos("xpSkin", "", $xpSkin) $clock = GUICtrlCreateLabel("", $clockPos[2] - 50, -1 + 5, BitOR($SS_SIMPLE, $SS_SUNKEN)) $datePos = ControlGetPos("", "", $clock) GUICtrlSetTip($clock, _DateTimeFormat(_NowCalc(), 1)) ;, $datePos[0] - 5, $datePos[1] - 5) GUICtrlSetColor($clock, 0x00ff00) ;main() ControlHide("ClassName=Progman", "FolderView", "SysListView321") ControlHide("ClassName=Shell_TrayWnd", "", "TrayClockWClass1") ControlHide("ClassName=Shell_TrayWnd", "", "Button1") ControlHide("ClassName=Shell_TrayWnd", "", "Button2") ControlHide("ClassName=Shell_TrayWnd", "", "ToolbarWindow321") ControlHide("ClassName=Shell_TrayWnd", "", "ToolbarWindow322") ControlHide("ClassName=Shell_TrayWnd", "", "") ;display dialog on top of all windows GUIRegisterMsg($WM_ACTIVATEAPP, "_MY_WM_ACTIVATEAPP");###################### GUISetState(@SW_SHOW, $xpSkin) WinSetOnTop("xpSkin", "", 1) While 1 $msg = GUIGetMsg() Select Case $msg = $goButton GoMenu() EndSelect ;if NOT winactive("GoMenu") then ;GUIDelete($goMenu) ;GUISetState(@SW_ENABLE, $xpSkin) ;endif WEnd Func clockTimer() GUICtrlSetData($clock, @HOUR & ":" & @MIN & ":" & @SEC) EndFunc ;==>clockTimer Func GoMenu() GUISetState(@SW_DISABLE, $xpSkin) $goMenu = GUICreate("GoMenu", 200, 500, (@DesktopWidth / 4) / 2 - 2, @DesktopHeight / 3.2, BitOR($WS_POPUP, $WS_DLGFRAME, $WS_EX_TOOLWINDOW)) GUISetBkColor(0x000000) GUISetState(@SW_SHOW, $goMenu) GUISwitch($goMenu) Sleep(3000) GUIDelete($goMenu) GUISetState(@SW_ENABLE, $xpSkin) EndFunc ;==>GoMenu Func goMenuTimer() If Not WinActive("GoMenu") Then ;GUIDelete($goMenu) ;GUISetState(@SW_ENABLE, $xpSkin) EndIf EndFunc ;==>goMenuTimer Func _MY_WM_ACTIVATEAPP($hwnd, $msg, $wParam, $lParam);###################### Local $nNotifyCode = BitShift($wParam, 16) Local $nID = BitAND($wParam, 0xFFFF) Local $hCtrl = $lParam If $nID = 0 Then ;Window has lost focus MsgBox(64, 'Info', 'Your window has lost focus.') quit() EndIf Return 1 EndFunc ;==>_MY_WM_ACTIVATEAPP Func quit() ControlShow("ClassName=Shell_TrayWnd", "", "") ControlShow("ClassName=Shell_TrayWnd", "", "TrayClockWClass1") ControlShow("ClassName=Shell_TrayWnd", "", "Button1") ControlShow("ClassName=Shell_TrayWnd", "", "Button2") ControlShow("ClassName=Shell_TrayWnd", "", "ToolbarWindow321") ControlShow("ClassName=Shell_TrayWnd", "", "ToolbarWindow322") ControlShow("ClassName=Progman", "", "SysListView321") Exit EndFunc ;==>quit Edit: Added codebox tags Edit2: P.S. Don't forget Opt('WinTitleMatchMode', 4) since you are using classname= Edited March 2, 2007 by SmOke_N Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer.
monte Posted March 2, 2007 Author Posted March 2, 2007 Thanks smoke_n, and sorry about the control/window specification, I suppose I'm not familiar yet with autoit symantecs. This code works great, though I cannot make $goMenu (the window that appears when you press go)disappear if it has lost focus. My changes are marked with ;###################### Basically, I changed func goMenu() to include a paramater testing for creation or deletion of the window. expandcollapse popup#include <GUIConstants.au3> #include <Date.au3> Global Const $WM_ACTIVATEAPP = 0x01C AdlibEnable("clockTimer", 100) ;adlibenable("goMenuTimer", 100) $g_szVersion = "xpSkin" If WinExists($g_szVersion) Then Exit AutoItWinSetTitle($g_szVersion) HotKeySet("{ESC}", "quit") ;create gui $xpSkin = GUICreate("xpSkin", @DesktopWidth / 4 * 3, @DesktopHeight / 38.4, -1, @DesktopHeight - 25, BitOR($WS_POPUP, $WS_DLGFRAME, $WS_EX_TOOLWINDOW)) GUISetBkColor(0x000000) $goButton = GUICtrlCreateLabel("Go", 3, 3, 25) GUICtrlSetBkColor($goButton, 0x000000) GUICtrlSetColor($goButton, 0x00ff00) $clockPos = ControlGetPos("xpSkin", "", $xpSkin) $clock = GUICtrlCreateLabel("", $clockPos[2] - 50, -1 + 5, BitOR($SS_SIMPLE, $SS_SUNKEN)) $datePos = ControlGetPos("", "", $clock) GUICtrlSetTip($clock, _DateTimeFormat(_NowCalc(), 1));, $datePos[0] - 5, $datePos[1] - 5) GUICtrlSetColor($clock, 0x00ff00) ;main() ControlHide("ClassName=Progman", "FolderView", "SysListView321") ControlHide("ClassName=Shell_TrayWnd", "", "TrayClockWClass1") ControlHide("ClassName=Shell_TrayWnd", "", "Button1") ControlHide("ClassName=Shell_TrayWnd", "", "Button2") ControlHide("ClassName=Shell_TrayWnd", "", "ToolbarWindow321") ControlHide("ClassName=Shell_TrayWnd", "", "ToolbarWindow322") ControlHide("ClassName=Shell_TrayWnd", "", "") ;display dialog on top of all windows GUIRegisterMsg($WM_ACTIVATEAPP, "_MY_WM_ACTIVATEAPP") GUISetState(@SW_SHOW, $xpSkin) WinSetOnTop("xpSkin", "", 1) While 1 $msg = GUIGetMsg() Select Case $msg = $goButton GoMenu(0);###################### EndSelect WEnd Func clockTimer() GUICtrlSetData($clock, @HOUR & ":" & @MIN & ":" & @SEC) EndFunc;==>clockTimer Func GoMenu($focus);###################### $goMenu = guicreate ("GoMenu", 200, 500, (@desktopwidth/4)/2 - 2, @desktopheight/3.2, BitOr($WS_POPUP,$WS_DLGFRAME,$WS_EX_TOOLWINDOW)) GUICtrlSetBkColor($goMenu, 0x000000) GUICtrlSetColor($goMenu, 0x00ff00) if NOT $focus = 1 then GUISetState(@SW_DISABLE, $xpSkin) GUISetState (@SW_ENABLE, $goMenu) GUISetState (@SW_SHOW, $goMenu) guiswitch($goMenu) endif if $focus = 1 then GUISetState(@SW_DISABLE, $goMenu) GUISetState(@SW_HIDE, $goMenu) GUISetState (@SW_ENABLE, $xpSkin) guiswitch($xpSkin) endif EndFunc;==>GoMenu Func _MY_WM_ACTIVATEAPP($hwnd, $msg, $wParam, $lParam) Local $nNotifyCode = BitShift($wParam, 16) Local $nID = BitAND($wParam, 0xFFFF) Local $hCtrl = $lParam If $nID = 0 Then ;Window has lost focus ;MsgBox(64, 'Info', 'Your window has lost focus.');###################### ;quit();###################### GoMenu(1);###################### EndIf Return 1 EndFunc;==>_MY_WM_ACTIVATEAPP Func quit() ControlShow("ClassName=Shell_TrayWnd", "", "") ControlShow("ClassName=Shell_TrayWnd", "", "TrayClockWClass1") ControlShow("ClassName=Shell_TrayWnd", "", "Button1") ControlShow("ClassName=Shell_TrayWnd", "", "Button2") ControlShow("ClassName=Shell_TrayWnd", "", "ToolbarWindow321") ControlShow("ClassName=Shell_TrayWnd", "", "ToolbarWindow322") ControlShow("ClassName=Progman", "", "SysListView321") Exit EndFunc;==>quit
monte Posted March 2, 2007 Author Posted March 2, 2007 I've found a solution...instead of using a label and window, I'm going to use GUICtrlCreateContextMenu. Thanks for all your help smoke_n. By the way, how in the world was I suppose to find / learn about your suggestion? Thanks! : $WM_ACTIVATEAPP = 0x01C GUIRegisterMsg($WM_ACTIVATEAPP, "_MY_WM_ACTIVATEAPP") Func _MY_WM_ACTIVATEAPP($hwnd, $msg, $wParam, $lParam) Local $nNotifyCode = BitShift($wParam, 16) Local $nID = BitAND($wParam, 0xFFFF) Local $hCtrl = $lParam If $nID = 0 Then ;Window has lost focus ;MsgBox(64, 'Info', 'Your window has lost focus.');###################### ;quit();###################### GoMenu(1);###################### EndIf Return 1 EndFunc;==>_MY_WM_ACTIVATEAPP
Moderators SmOke_N Posted March 2, 2007 Moderators Posted March 2, 2007 Thanks for all your help smoke_n. By the way, how in the world was I suppose to find / learn about your suggestion? Thanks! : My suggestion? Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer.
Moderators SmOke_N Posted March 2, 2007 Moderators Posted March 2, 2007 your suggested solution / code changes.No worries... that's me watching a lot of others using GUIRegisterMsg() and using APIViewer2004.exe to play with the all the fun things in it... you should see some of these guys ... gafrost/eltorro and others that play with the function often and what they have shown the ability to be had from them. Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now