Sign in to follow this  
Followers 0
XiaolinDraconis

OnTopPeekThrough Something Went Wrong... Again.

15 posts in this topic

#1 ·  Posted (edited)

Trying to make two functions work on one HotKeySet during testing each component worked great. However when I put it all together, something in the Func TapTimer() has failed, at least I think that's the problem. It works properly the first run, after that it seems to either stop toggling the hotkey off, or _IsPressed keeps reporting that I let go even though I'm still holding it.

Anyone know how to get it working properly?

#NoTrayIcon
#include <Misc.au3>
#include <MsgBoxConstants.au3>
#include <TrayConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <SliderConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Opt("TrayMenuMode", 3) ; The default tray menu items will not be shown and items are not checked when selected. These are options 1 and 2 for TrayMenuMode.
Opt("TrayOnEventMode", 1) ; Enable TrayOnEventMode.

HotKeySet("^{SPACE}", "TapTimer")

If FileExists(@AutoItExe & "\OTPT.ini") Then
Sleep(10)
Else
IniWrite("OTPT.ini", "AOT", "True", "1" & @CRLF)
IniWrite("OTPT.ini", "Transparency", "Value", "204" & @CRLF & @CRLF & "Max Transparency Value = 255")
EndIf

$Toggle = 0
$AOT = IniRead("OTPT.ini", "AOT", "True", "1")
$Transparency = IniRead("OTPT.ini", "Transparency", "Value", "204")


TrayMenu()

Func TrayMenu()
TrayCreateItem("Settings")
TrayItemSetOnEvent(-1, "Options")

TrayCreateItem("About")
TrayItemSetOnEvent(-1, "About")

TrayCreateItem("") ; Create a separator line.

TrayCreateItem("Exit")
TrayItemSetOnEvent(-1, "ExitScript")

TraySetOnEvent($TRAY_EVENT_PRIMARYDOUBLE, "Options") ; Display the About MsgBox when the tray icon is double clicked on with the primary mouse button.

TraySetState($TRAY_ICONSTATE_SHOW) ; Show the tray menu.
EndFunc   ;==>TrayMenu

While 1
Sleep(100) ; An idle loop.
WEnd

Func TapTimer()
$DLL = DllOpen("user32.dll")
HotKeySet("^{SPACE}")
$Timer = TimerInit()
While _IsPressed("20",$DLL)
Sleep(1000)
WEnd
$Time = TimerDiff($Timer)
If $Time < 3000 Then
OnTop()
Sleep(500)
Else
Options()
Sleep(500)
EndIf
DllClose($DLL)
HotKeySet("^{SPACE}", "OnTop")
EndFunc   ;==>TapTimer

Func Options()
$Form1 = GUICreate("Settings", 290, 142)
$Radio1 = GUICtrlCreateRadio("", 119, 32, 17, 17)
$Radio2 = GUICtrlCreateRadio("", 168, 32, 17, 17)
$Label1 = GUICtrlCreateLabel("ON", 96, 32, 20, 17)
$Label2 = GUICtrlCreateLabel("OFF", 142, 30, 24, 17)
$Slider = GUICtrlCreateSlider(13, 72, 255, 25)
GUICtrlSetData(-1,$Transparency)
GUICtrlSetLimit(-1, 255, 0)
$Label3 = GUICtrlCreateLabel("-", 8, 72, 15, 17)
$Label4 = GUICtrlCreateLabel("+", 269, 70, 10, 17)
$Label5 = GUICtrlCreateLabel("Always On Top", 102, 3, 89, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Label6 = GUICtrlCreateLabel("Transparency", 106, 56, 81, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$OK = GUICtrlCreateButton("OK", 128, 104, 33, 33)
GUISetState(@SW_SHOW)

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
GUISetState(@SW_HIDE)
Case $OK
While GUICtrlRead($Radio1) = $GUI_UNCHECKED And GUICtrlRead($Radio2) = $GUI_UNCHECKED
Sleep(100)
ToolTip("Please Select ON/OFF State")
WEnd
If GUICtrlGetState($Radio1) = $GUI_CHECKED Then
$AOT = 1
$Transparency = GUICtrlRead($Slider)
Else
$AOT = 0
$Transparency = GUICtrlRead($Slider)
EndIf
IniWrite("OTPT.ini", "AOT", "True", $AOT)
IniWrite("OTPT.ini", "Transparency", "Value", $Transparency)
ToolTip("")
GUISetState(@SW_HIDE)
ExitLoop
EndSwitch
WEnd
EndFunc   ;==>Options

Func About()
MsgBox($MB_OK, "About", "OnTopPeekThrough" & @CRLF & @CRLF & _
"Press CTRL+SPACE to toggle" & @CRLF & _
"Or hold 3 seconds for Options" & @CRLF & @CRLF & _
"By: XiaolinDraconis")
EndFunc   ;==>About

Func OnTop()
If $Toggle = 0 Then
$Toggle = 1
Set()
Else
$Toggle = 0
Unset()
EndIf
EndFunc   ;==>OnTop

Func Set()
$WinTitle = WinGetTitle("[active]")
WinSetOnTop($WinTitle, "", 1)
WinSetTrans($WinTitle, "", $Transparency)
EndFunc   ;==>Set

Func Unset()
$WinTitle = WinGetTitle("[active]")
WinSetOnTop($WinTitle, "", 0)
WinSetTrans($WinTitle, "", 255)
EndFunc   ;==>Unset

Func ExitScript()
Exit
EndFunc   ;==>ExitScript
Edited by XiaolinDraconis

Share this post


Link to post
Share on other sites



#3 ·  Posted (edited)

An explanation of what it is supposed to do would be good.

 

 

If CTRL+Space are pressed for less than 3 seconds it makes the active window always on top and transparent, longer than that it will open the settings dialog. Toggles with each tap.

Edited by XiaolinDraconis

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

Just realized I need to add something to the options, redefine HotKey. Oh boy... I'll handle that after this issue gets sorted.

Edited by XiaolinDraconis

Share this post


Link to post
Share on other sites

#5 ·  Posted (edited)

"If calling this function repeatedly, you should open 'user32.dll' and pass the handle.

Make sure to close the handle at end of script using DllClose."

Derped once again.

Ok then, apparently I still don't understand, I used the DLLCall but to no avail.

Updated OP with altered (still fail) code

Edited by XiaolinDraconis

Share this post


Link to post
Share on other sites

#6 ·  Posted (edited)

Func TapTimer()
    HotKeySet("^{SPACE}")
    $TapTime = 0
    While _IsPressed("20")
        Sleep(1000)
        $TapTime += 1
    WEnd
    If $TapTime < 3 Then
        OnTop()
        Sleep(500)
    Else
        Options()
        Sleep(500)
    EndIf
    HotKeySet("^{SPACE}", "OnTop")
EndFunc   ;==>TapTimer

Once again it works as expected, but only once. Holding the hotkey again simply rapid fires the OnTop() function. I don't see how it can since the first line in TapTimer() is set to disable the hotkey.

Edited by XiaolinDraconis

Share this post


Link to post
Share on other sites

I'm tired, quit laughing.

Share this post


Link to post
Share on other sites

Here's a repo so you might see.

#include <Misc.au3>

HotKeySet("^{SPACE}", "TapTimer")

While 3
    Sleep(300)
WEnd


Func TapTimer()
    HotKeySet("^{SPACE}")
    $TapTime = 0
    While _IsPressed("20")
        Sleep(1000)
        $TapTime += 1
    WEnd
    If $TapTime < 3 Then
        ConsoleWrite("OnTop()" & @LF)
        Sleep(500)
    Else

        ConsoleWrite("Options()" & @LF)
        Sleep(500)
    EndIf
    HotKeySet("^{SPACE}", "OnTop")
EndFunc   ;==>TapTimer

Func OnTop()
    ConsoleWrite("In OnTop() Function" & @LF) 
EndFunc

AutoIt Absolute Beginners    Require a serial    Pause Script    Video Tutorials by Morthawt   ipify 

Monkey's are, like, natures humans.

Share this post


Link to post
Share on other sites

#10 ·  Posted (edited)

Yeah I noticed that bit immediately after posting the snippet with that line in it.

If you could prevent me from making a new thread, I'm now trying to understand why my slider keeps reverting to 100 and no radio is checked even though it should be reading those settings from the variables.

$Form1 = GUICreate("Settings", 290, 142)
    $Radio1 = GUICtrlCreateRadio("", 119, 32, 17, 17)
    If $AOT = 1 Then
        GUICtrlSetData($Radio1,$GUI_CHECKED,$GUI_CHECKED)
    Else
        GUICtrlSetData($Radio1,$GUI_UNCHECKED,$GUI_UNCHECKED)
    EndIf
    $Radio2 = GUICtrlCreateRadio("", 168, 32, 17, 17)
    $Label1 = GUICtrlCreateLabel("ON", 96, 32, 20, 17)
    $Label2 = GUICtrlCreateLabel("OFF", 142, 30, 24, 17)
    $Slider = GUICtrlCreateSlider(13, 72, 255, 25)
    GUICtrlSetData(-1, $Transparency)
    GUICtrlSetLimit(-1, 255, 0)
    $Label3 = GUICtrlCreateLabel("-", 8, 72, 15, 17)
    $Label4 = GUICtrlCreateLabel("+", 269, 70, 10, 17)
    $Label5 = GUICtrlCreateLabel("Always On Top", 102, 3, 89, 17)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    $Label6 = GUICtrlCreateLabel("Transparency", 106, 56, 81, 17)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    $OK = GUICtrlCreateButton("OK", 128, 104, 33, 33)
    GUISetState(@SW_SHOW)
Edited by XiaolinDraconis

Share this post


Link to post
Share on other sites

#NoTrayIcon
#include <Misc.au3>
#include <MsgBoxConstants.au3>
#include <TrayConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <SliderConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Opt("TrayMenuMode", 3) ; The default tray menu items will not be shown and items are not checked when selected. These are options 1 and 2 for TrayMenuMode.
Opt("TrayOnEventMode", 1) ; Enable TrayOnEventMode.

HotKeySet("^{SPACE}", "TapTimer")

If FileExists(".\OTPT.ini") Then
    Sleep(1000)
Else
    IniWrite("OTPT.ini", "AOT", "True", "1" & @CRLF)
    IniWrite("OTPT.ini", "Transparency", "Value", "204" & @CRLF & @CRLF & "Max Transparency Value = 255")
EndIf

$Toggle = 0
$AOT = IniRead("OTPT.ini", "AOT", "True", "1")
$Transparency = IniRead("OTPT.ini", "Transparency", "Value", "204")


TrayMenu()

Func TrayMenu()
    TrayCreateItem("Settings")
    TrayItemSetOnEvent(-1, "Options")

    TrayCreateItem("About")
    TrayItemSetOnEvent(-1, "About")

    TrayCreateItem("") ; Create a separator line.

    TrayCreateItem("Exit")
    TrayItemSetOnEvent(-1, "ExitScript")

    TraySetOnEvent($TRAY_EVENT_PRIMARYDOUBLE, "Options") ; Display the About MsgBox when the tray icon is double clicked on with the primary mouse button.

    TraySetState($TRAY_ICONSTATE_SHOW) ; Show the tray menu.
EndFunc   ;==>TrayMenu

While 1
    Sleep(100) ; An idle loop.
WEnd

Func TapTimer()
    HotKeySet("^{SPACE}")
    $TapTime = 0
    While _IsPressed("20")
        Sleep(1000)
        $TapTime += 1
    WEnd
    If $TapTime < 3 Then
        OnTop()
        Sleep(500)
    Else
        Options()
        Sleep(500)
    EndIf
    HotKeySet("^{SPACE}", "TapTimer")
EndFunc   ;==>TapTimer

Func Options()

    $Form1 = GUICreate("Settings", 290, 142)
    $Radio1 = GUICtrlCreateRadio("", 119, 32, 17, 17)
    If $AOT = 1 Then
        GUICtrlSetData($Radio1, $GUI_CHECKED, $GUI_CHECKED)
    Else
        GUICtrlSetData($Radio1, $GUI_UNCHECKED, $GUI_UNCHECKED)
    EndIf
    $Radio2 = GUICtrlCreateRadio("", 168, 32, 17, 17)
    $Label1 = GUICtrlCreateLabel("ON", 96, 32, 20, 17)
    $Label2 = GUICtrlCreateLabel("OFF", 142, 30, 24, 17)
    $Slider = GUICtrlCreateSlider(13, 72, 255, 25)
    GUICtrlSetData(-1, $Transparency)
    GUICtrlSetLimit(-1, 255, 0)
    $Label3 = GUICtrlCreateLabel("-", 8, 72, 15, 17)
    $Label4 = GUICtrlCreateLabel("+", 269, 70, 10, 17)
    $Label5 = GUICtrlCreateLabel("Always On Top", 102, 3, 89, 17)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    $Label6 = GUICtrlCreateLabel("Transparency", 106, 56, 81, 17)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    $OK = GUICtrlCreateButton("OK", 128, 104, 33, 33)
    GUISetState(@SW_SHOW)
    WinSetOnTop("Settings", "", 1)

    While 1
        WinActivate("Settings")
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                GUISetState(@SW_HIDE)
                ExitLoop
            Case $OK
                While GUICtrlRead($Radio1) = $GUI_UNCHECKED And GUICtrlRead($Radio2) = $GUI_UNCHECKED
                    Sleep(100)
                    ToolTip("Please Select ON/OFF State")
                    WinActivate("Settings")
                WEnd
                If GUICtrlGetState($Radio1) = $GUI_CHECKED Then
                    $AOT = 1
                    $Transparency = GUICtrlRead($Slider)
                Else
                    $AOT = 0
                    $Transparency = GUICtrlRead($Slider)
                EndIf
                IniWrite("OTPT.ini", "AOT", "True", $AOT)
                IniWrite("OTPT.ini", "Transparency", "Value", $Transparency)
                ToolTip("")
                GUISetState(@SW_HIDE)
                ExitLoop
        EndSwitch
    WEnd
EndFunc   ;==>Options

Func About()
    MsgBox($MB_OK, "About", "OnTopPeekThrough" & @CRLF & @CRLF & _
            "Press CTRL+SPACE to toggle" & @CRLF & _
            "Or hold 3 seconds for Options" & @CRLF & @CRLF & _
            "By: XiaolinDraconis")
EndFunc   ;==>About

Func OnTop()
    If $Toggle = 0 Then
        $Toggle = 1
        Set()
    Else
        $Toggle = 0
        Unset()
    EndIf
EndFunc   ;==>OnTop

Func Set()
    $WinTitle = WinGetTitle("[active]")
    WinSetOnTop($WinTitle, "", 1)
    WinSetTrans($WinTitle, "", $Transparency)
EndFunc   ;==>Set

Func Unset()
    $WinTitle = WinGetTitle("[active]")
    WinSetOnTop($WinTitle, "", 0)
    WinSetTrans($WinTitle, "", 255)
EndFunc   ;==>Unset

Func ExitScript()
    Exit
EndFunc   ;==>ExitScript

My apologies.

Share this post


Link to post
Share on other sites

I think I need to start over, get a fresh look at what's in my head. See how I really want this to work, as it is I went for something simple and kept tweaking.

Share this post


Link to post
Share on other sites

I thought you solved, the thread is marked as answered.

Well yeah, but one problem leads to another, and then I got new ideas for it while fixing those. 

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0