Obi-Wahns Codeschnipsel

Poste hier Sourcen von Skripten, Funktionen und kleine Helferlein

Moderator: Obi-Wahn

Obi-Wahns Codeschnipsel

Postby Obi-Wahn » 27.05.2008, 15:10

Hi!

Ich hab mir gedacht, ich poste mal hier ein paar codeschnipsel, die ich mir teilweise auch von anderen Codern zusammengestückelt hab. Funktionen die ich komplett übernommen, nur umgecoded hab, sind mit einer URL zum originalpost gekennzeichnet.

INHALTSVERZEICHNIS:
HIDE-SHOW-WINDOWS (Boss-Key für das System)
CREATE NEW FOLDER (Neuen Ordner per Tastendruck erstellen)
CHANGE SCREEN RES (Ändern der Bildschirmauflösung)
TAKE-A-SHOT (Screenshot per Tastendruck)
REMAP ARROWS (Pfeiltasten via CapsLock auf Pfeiltaste oder Mausbewegung umschalten)

AHK Rainmeter Ersatzfunktionen:
DRIVEMETER (Anzeigen der Laufwerksbelegung)
BATTERYSTATUS (Anzeigen des Akkuladestandes)
ONLINESTATUS (Anzeigen des Netzstatus)

PS.: Ich könnte den Topic Sperren, aber dann würde eine etwaige Diskussion / Frage wieder aus dem Kontext gerissen werden. Ich habe mich desswegen entschieden, den ersten Post als Inhaltsverzeichnis zu warten. Codes werden folgen, im Inhaltsverzeichnis ist aber alles einsehbar.

Greets
O-W
bash.org wrote:<erno> hm. I've lost a machine.. literally _lost_. it responds to ping, it works completely, I just can't figure out where in my apartment it is.

Operative Hektik ist ein ziemlich sicheres Zeichen für zerebrale Windstille...
User avatar
Obi-Wahn
Moderator
 
Posts: 205
Joined: 12.09.2007, 11:43
Location: Wien

Re: Obi-Wahns Codeschnipsel

Postby Obi-Wahn » 27.05.2008, 15:11

HIDE-SHOW-WINDOWS
EIn kleines Script was ich mal geschrieben hab. Is quasi eine Systemweite Boss-Taste (wie von Moorhuhn), nur man kann die Klassen einfach im Exclude-Parameter angeben. Dann bleiben die Fenster stehen.

Code: Select all
/*
MANPAGE.
********
Funktionsaufruf (Verstecken) [Strg + Shift + h]
   "Job" beinhaltet die Versteckten Fenster, die Parameter in der Klammer
   werden wieder am Ende gezeigt (Müssen durch Leerzeichen getrennt werden).

   Der Parameter beihnaltet alle KlassenNamen, die vor'm Return wieder gezeigt
   werden sollen. Die Teilung der einzelnen Klasennamen erfolgt durch ein
   Semikolon (;) [WICHTIG].
   
   Shell_TrayWnd ... Taskleiste
   Progman       ... Desktop (Icons, aber auch Software die sich dieser Klasse
                        bedient, z.B. Rainmeter, auf OnDesktop gestellt)

Funktionsaufruf (Zeigen) [Strg + Shift + s]
   Der Parameter in der klammer beinhaltet die zu wiederherstellenden Fenster
*/

^+h::Job := HideWindows("Shell_TrayWnd;Progman")   ; Funktionsaufruf (Verstecken)
^+s::ShowWindows(Job)                        ; Funktionsaufruf (Zeigen)

HideWindows(Remaining) {
   Loop, Parse, Remaining, `;      ; Parse-Loop, um die Klassen zu Teilen
      {
      WinGet, EID, ID, ahk_class %A_LoopField%   ; ID der Klasse abfragen (muss sein, da bei Restart neue ID's vergeben werden)
      Exclude_IDs = %EID%,%Exclude_IDs%         ; ID's in Matchlist schreiben
      }
   WinGet, Fenster, List      ; Erstelle die Liste der ID's
   Loop, %Fenster%   {         ; Loop der ID's
      this_id := Fenster%A_Index%         ; Speichere die aktuelle ID
      If this_id not in %Exclude_IDs%      ; Wenn die aktuelle ID nicht in der Matchlist vorkommt, dann
         {
         HiddenWindows = %this_id% %HiddenWindows%   ; Speichere die ID in der Variable (zum wiederherstellen)
         WinHide, ahk_id %this_id%      ; Verstecke das Fenster
         }
      }
   Return, %HiddenWindows%      ; Als Return gibts die ID's der Versteckten Fenster
   }

ShowWindows(Hidden) {
   DetectHiddenWindows, on         ; Versteckte Fenster werden erkannt
   Loop, Parse, Hidden, %A_Space%   ; Loop, Parse, durch die Liste der Verstekten Fenster.
      WinShow, ahk_id %A_LoopField%   ; Zeige die Versteckten Fenster wieder
   Return, "Fertig"
   }


############################################

CREATE NEW FOLDER
Ich hab eigentlich nur eine Funktion von SKAN glaub ich genommen, hab den Teil für die 9.x Win Versionen gekickt und hab ein FileCreatedir dazugepflanzt.
Leider wird der Ordner nicht sofort zur bearbeitung freigegeben, aber für mich, der kein Edit1 (oder wars Edit2) feld im Explorer hat, weil er einen Vista-Ersatz nimmt, hilft das schon weiter, und ist schöner als die "{AppsKey}nf" lösung.

Code: Select all
#n::FileCreateDir, % GetWindowsExplorerPath() . "\Neuer Ordner"

GetWindowsExplorerPath() {
   ; http://www.autohotkey.com/forum/viewtopic.php?t=10273
   hWnd := WinExist("A")
   WinGetClass wClass, ahk_id %hWnd%
   IfEqual, wClass, Progman, Return, %A_Desktop%
   If (wClass != "ExploreWClass" and wClass != "CabinetWClass")
      Return, 1
   pid := DllCall("GetCurrentProcessId")
   SendMessage, 0x400 + 12, pid, 0, , ahk_id %hWnd%
   hMem := ErrorLevel
   If (hMem != 0) {
      pv := DllCall("Shell32\SHLockShared", "UInt", hMem, "UInt", pid)
      if (pv != 0) {
         pidl := DllCall("Shell32\ILClone", "UInt", pv)
         DllCall("Shell32\SHUnlockShared", "UInt", pv)
      }
      DllCall("Shell32\SHFreeShared", "UInt", hMem, "UInt", pid)
   }
   VarSetCapacity(explorerPath, 512, 0)
   DllCall("Shell32\SHGetPathFromIDList", "UInt", pidl, "Str", explorerPath)
   Return %explorerPath%
}


############################################

CHANGE SCREEN RES
Nur eine kleine Funktion, die ich als nützlich erachte.

Code: Select all
; Shimanov & Skan / http://www.autohotkey.com/forum/post-164871.html#164871
; cD -> BitsPerPixel / sW -> Breite / sH -> Höhe / rR -> BildschirmFrequenz
ChangeDisplaySettings( cD, sW, sH, rR ) {
   VarSetCapacity(dM,156,0), NumPut(156,2,&dM,36)
   DllCall( "EnumDisplaySettings", UInt,0, UInt,-1, UInt,&dM ), NumPut(0x5c0000,dM,40)
   NumPut(cD,dM,104),   NumPut(sW,dM,108),   NumPut(sH,dM,112),   NumPut(rR,dM,120)
   Return DllCall( "ChangeDisplaySettings", UInt,&dM, UInt,0 )
}


############################################

TAKE-A-SHOT
Hab ich mal geschrieben/gestücket. Is ne Funktion für Screenshots auf Tastendruck.

Übergebbare Argumente:
- Window oder Screen (Pflicht)
- Speicherort abfragen
- Ausdrucken (nur WinXP)
- Löschen nach dem Ausdruck

Code: Select all
/*
CREDITS:
| Sean
| Lazlo
|
| URLS:
| http://www.autohotkey.com/forum/viewtopic.php?t=17179&highlight=gdi
| http://www.autohotkey.com/forum/topic16631.html
| http://www.a-bit-more.de/userhomes/www.a-bit-more.de/cms/produkte/ITHau.Apps.ImageManipulator/Manual.html
|
| MODIFICATIONS:
| Alle unnötigen (auskommatierten zeilen entfernt.
| Ausdruck-Dll-Call hinzugefügt
*/

#NoEnv
SendMode Input
#SingleInstance, force
F12::TakeAShot("Window", 1)
Return

TakeAShot(Area, AskForLocation = 1, Location = "", PrintIt = 0, DeleteOnFinishedPrint = 1) {
   Clipboard =
   IfEqual, Area, Screen, Send, {PrintScreen}
   Else, Send, !{PrintScreen}
   IfEqual, AskForLocation, 1, FileSelectFile, Img, S, , Bitte Speicherpfad angeben..., JPG-Bilder (*.jpg)
   Else, SetEnv, Img, %Location%
   IfNotInString, Img, .jpg, SetEnv, Img, %Img%.jpg
   Ansi2Unicode(Img, wFileTo)
   GUID4String(ImageCodecJPG, "{557CF401-1A04-11D3-9A73-0000F81EF32E}")
   VarSetCapacity(xParam, 4 + 28 + 4)
   GUID4String(EncoderTransformation, "{8D0EB2D1-A58E-4EA8-AA14-108074B7B6F9}")  ; Transformation: 13 14 15 16 17
   EncodeInteger(&xParam +  0, 1)                     ; number of list
   RtlMoveMemory(&xParam +  4, &EncoderTransformation, 16)   ; 16 byte CLSID of Encoder
   EncodeInteger(&xParam + 20, 1)                     ; number of values
   EncodeInteger(&xParam + 24, 4)                     ; type of values
   EncodeInteger(&xParam + 28, &xParam + 32)            ; address of the value
   EncodeInteger(&xParam + 32, 14)
   hGdiPlus := DllCall("LoadLibrary", "str", "gdiplus.dll")
   VarSetCapacity(si, 16, 0)
   si := Chr(1)
   DllCall("gdiplus\GdiplusStartup", "UintP", pToken, "Uint", &si, "Uint", 0)
   ; Ab hier zugriff auf die zwischenablage
   DllCall("OpenClipboard", "Uint", 0)
   If DllCall("IsClipboardFormatAvailable", "Uint", 2)
      hBM := DllCall("GetClipboardData", "Uint", 2)
   DllCall("CloseClipboard")
   If !hBM
      Return, 1
   DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", "Uint", hBM, "Uint", 0, "UintP", pImage)
   ; Ende zwischenablagezugriff
   DllCall("gdiplus\GdipSaveImageToFile"  , "Uint", pImage, "str", wFileTo, "str", ImageCodecJPG, "str", xParam)
   DllCall("gdiplus\GdipDisposeImage", "Uint", pImage)
   DllCall("gdiplus\GdiplusShutdown" , "Uint", pToken)
   DllCall("FreeLibrary", "Uint", hGdiPlus)
   
   If (PrintIt = 1) {
      RegRead, StdPrnt, HKCU, Software\Microsoft\Windows NT\CurrentVersion\Windows, Device
      StringSplit, PrntrName, StdPrnt, `,
      RunWait, %comspec% /c "rundll32.exe shimgvw.dll`,ImageView_PrintTo /pt "%Img%" "%PrntrName1%"", , Hide
      IfEqual, DeleteOnFinishedPrint, 1, FileDelete, %Img%
   }
   Return, 0
}

RtlMoveMemory(pDst, pSrc, nSize = 1) {
   DllCall("RtlMoveMemory", "Uint", pDst, "Uint", pSrc, "Uint", nSize)
}

; Das notwendigste aus der COMHelper (COHelper.ahk)
Ansi2Unicode(ByRef sString, ByRef wString, nLen = 0) {
   If !nLen
       nLen := DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", 0, "int", 0)
   VarSetCapacity(wString, nLen * 2 + 1)
   DllCall("MultiByteToWideChar", "Uint", 0, "Uint", 0, "Uint", &sString, "int", -1, "Uint", &wString, "int", nLen)
}

GUID4String(Byref CLSID, sString) {
   VarSetCapacity(CLSID, 16)
   Ansi2Unicode(sString, wString, 38)
   DllCall("ole32\CLSIDFromString", "str", wString, "str", CLSID)
}

EncodeInteger(ref, val, nSize = 4) {
   DllCall("RtlMoveMemory", "Uint", ref, "int64P", val, "Uint", nSize)
}


############################################

REMAP ARROWS
ich hab das Script mal für einen Typen geschrieben, der eine behinderte Frau betreut hat.
Is nicht zum Einsatz gekommen, aber vllt. brauchts ja wer.
Ich persönlich finde den Code echt Geil. Ein Stuck code was nicht mehr und nicht weniger tut, als zu funktionieren.

Code: Select all
Left::Send % (GetKeyState("CapsLock", "T")=1) ? _MouseMove("L") : "{Left}"
Right::Send % (GetKeyState("CapsLock", "T")=1) ? _MouseMove("R") : "{Right}"
Down::Send % (GetKeyState("CapsLock", "T")=1) ? _MouseMove("D") : "{Down}"
Up::Send % (GetKeyState("CapsLock", "T")=1) ? _MouseMove("U") : "{Up}"

_MouseMove(D, S=5) {
   MouseMove, (D="L") ? -S : (D="R") ? S : 0, (D="D") ? S : (D="U") ? -S : 0, 0, R
}
bash.org wrote:<erno> hm. I've lost a machine.. literally _lost_. it responds to ping, it works completely, I just can't figure out where in my apartment it is.

Operative Hektik ist ein ziemlich sicheres Zeichen für zerebrale Windstille...
User avatar
Obi-Wahn
Moderator
 
Posts: 205
Joined: 12.09.2007, 11:43
Location: Wien

Re: Obi-Wahns Codeschnipsel

Postby IsNull » 27.05.2008, 15:31

Danke, einige Teile davon kann ich gut gebaruchen. Wenn ich nicht in 1,5 Wochen Teil-Abschlussprüfungen hätte, könnte ich es sogar gleich jetzt einbauen :/
Image
User avatar
IsNull
Site Admin
 
Posts: 414
Joined: 05.09.2007, 15:36
Location: CH

Re: Obi-Wahns Codeschnipsel

Postby Obi-Wahn » 17.06.2008, 16:33

AHK Rainmeter Ersatzfunktionen

DRIVEMETER v0.1
Das ist ein kleines Tool, welches die Laufwerke am Desktop als Progress-Bar (dessen Speicherbelegung) anzeigt. Jedes neu hinzugekommene Laufwerk wird auch angezeigt, die GUI automatisch aktualisiert.

Angegeben MÜSSEN werden
- DriveTyp (Siehe DriveGet, List)
- ExcludeList (Laufwerksbuchstaben die Ausgenommen werden sollen (z.b. A, B))

Angegeben werden KÖNNEN:
- Skalierung
- Weite der GUI/Progressbars
- Position X und Y
- Textfarbe
- Used-Space Farbe
- Free-Space Farbe
- Zeilenhöhe
- Farbe die Für die Transparenz verwendet werden soll

Fonthöhe berechnet sich automatisch durch die Skalierung.

Code: Select all
; _drivemeter
; Coded by Obi-Wahn
;

#NoTrayIcon
#Singleinstance, Force
SetTitleMatchMode, 3

Typ = FIXED|REMOVABLE      ; Art der Laufwerke die angezeigt werden sollen
Exc = AB      ; Laufwerksbuchstaben die Ausgeschlossen werden sollen
Scale = 1      ; Skalierfaktor

GoSub, Actualize_GUI
SetTimer, Actualize, 1000
SetTimer, Actualize_GUI, 1000
#n::ExitApp      ; [Win + n] als Hotkey zum Beenden (Während des Codens)
Return

Actualize:
Gui, 2:Default
D := _GetDriveList(Typ, Exc)
Loop, Parse, D
   _ActualizeDrive(A_LoopField)
Return

Actualize_GUI:
Gui, 2:Default
C1 := _GetDriveList(Typ, Exc)
If C1 != %C2%
   _DriveMeter(Typ, Exc, Scale)
C2 := _GetDriveList(Typ, Exc)
Return

_DriveMeter(Type, Exclude, Scale = 1, PosX = "Left", PosY = "Down", FontC = "White", BackC = "White"
         , ForeC = "Maroon", GenW = 150, RowH = 15, GuiC = "Black") {
   global
   local Cap, Nam, FreeSpace, Used, Per, FSize, WS, HS, X, Y, GenH, Drives
   Gui, Destroy
   Gui, Color, %GuiC%
   Gui, -Border -Caption +LastFound +ToolWindow
   WinSet, TransColor, %GuiC%
   Gui, Margin, 0, 0
   Drives := _GetDriveList(Type, Exclude)
   Loop, Parse, Drives
      {
      DriveGet, Cap, Capacity, %A_LoopField%:\
      DriveGet, Nam, Label, %A_LoopField%:\
      DriveSpaceFree, FreeSpace, %A_LoopField%:\
      Used := (Cap - FreeSpace), Per := Round((Used / (Cap / 100)), 1), FSize := 8 * Scale
      WS := GenW * Scale, HS := RowH * Scale
      Gui, Font, s%FSize% w600,
      Gui, Add, Text, w%WS% h%HS% c%FontC% , [%Nam%] - %A_LoopField%:\
      Gui, Add, Progress, yp+%HS% w%WS% h%HS% c%ForeC% Background%BackC% Range0-%Cap% vProgress_%A_LoopField% , %Used%
      Gui, Add, Text, w%WS% h%HS% c%FontC% vCap_%A_LoopField% , %Per%`% belegt - %FreeSpace% MB frei   ; %
      GenH += (3 * HS) + 5
      }
   X := PosX="Left" ? 0 : (A_ScreenWidth - GenW), Y := PosY="Top" ? 0 : (A_ScreenHeight - GenH)
   Gui, Show, x%X% y%Y% NoActivate, DriveMeter
   WinSet, Bottom, , DriveMeter ahk_class AutoHotkeyGUI
   WinSet, Disable, , DriveMeter ahk_class AutoHotkeyGUI
}

_ActualizeDrive(Drive) {
   DriveGet, Cap, Capacity, %Drive%:\
   DriveSpaceFree, FreeSpace, %Drive%:\
   Used := (Cap - FreeSpace)
   Per := Round((Used / (Cap / 100)), 1)
   GuiControl, , Progress_%Drive%, %Used%
   GuiControl, , Cap_%Drive%, %Per%`% belegt - %FreeSpace% MB frei   ; %
}

_GetDriveList(Types, Excludes) {
   Loop, Parse, Types, |
      {
      DriveGet, T, List, %A_LoopField%
      List = %List%%T%
      }
   Loop, Parse, Excludes
      StringReplace, List, List, %A_LoopField%,
   Sort, List, D
   Return, %List%
}

_drivemeter.ahk
(2.46 KiB) Downloaded 93 times


############################################

BATTERYSTATUS v0.1.2
Zwei Funktionen. Die eine erstellt die GUI, die andere aktualisiert sie.
Angegeben muss nichts, es kann aber folgendes angegeben werden:

- Skalierung
- Position (X/Y)
- Breite
- Zeilenhöhe
- Fontfarbe
- Hintergrundfarbe
- Vordergrundfarbe
- Transparenzfarbe

*** Changelog ***
Entfernt: GUI-ID (Bei Multiblen GUIs)
Grund: Bei multiplen GUI's: "Gui, 1:Default" verwenden. Is einfacher zu handeln bei erweiterungen
Entfernt: Zweite Funktion (Aktualisieren)
Grund: In Hauptfunktion integriert

Code: Select all
; batterystatus.ahk
; Coded by Obi-Wahn
;
#NoTrayIcon
SetTimer, BatteryStatus, 1000
#n::ExitApp
Return

BatteryStatus:
Gui, 10:Default
_BatteryStatus()
Return


_BatteryStatus(Scale = 1, PosX = "Left", PosY = "Dowm", FontC = "White", BackC = "White"
            , ForeC = "Maroon", GenW = 150, RowH = 15, GuiC = "Black") {
   global Progr, Tex
   If !WinExist("BatteryStatus ahk_class AutoHotkeyGUI") {
      Gui, Destroy
      Gui, Color, %GuiC%
      Gui, -Border -Caption +LastFound +ToolWindow
      WinSet, TransColor, %GuiC%
      Gui, Margin, 0, 0
      FSize := 8 * Scale, WS := GenW * Scale, HS := RowH * Scale
      Gui, Font, s%FSize% w600,
      Gui, Add, Text, w%WS% h%HS% c%FontC% vTex,
      Gui, Add, Progress, yp+%HS% w%WS% h%HS% c%ForeC% Background%BackC% Range0-100 vProgr, 0
      GenH += (2 * HS) + 5
      X := PosX="Left" ? 0 : (A_ScreenWidth - GenW), Y := PosY="Top" ? 0 : (A_ScreenHeight - GenH)
      Gui, Show, x%X% y%Y% NoActivate, BatteryStatus
      WinSet, Bottom, , BatteryStatus ahk_class AutoHotkeyGUI
      WinSet, Disable, , BatteryStatus ahk_class AutoHotkeyGUI
   } Else {
      VarSetCapacity(powerstatus, 1+1+1+1+4+4)
      DllCall("kernel32.dll\GetSystemPowerStatus", "uint", &powerstatus)
      Loop, 2 {
         IfEqual, A_Index, 1, SetEnv, p_offset, 0
         Else, SetEnv, p_offset, 2
         value := 0, old_FormatInteger := A_FormatInteger
         SetFormat, integer, dec
         Loop, 1
            value := value+( *( ( &powerstatus+p_offset )+( A_Index-1 ) ) << ( 8* ( A_Index-1 ) ) )
         SetFormat, integer, %old_FormatInteger%
         V%A_Index% = %value%
      }
      T := (V1<1 ? "Batteriebetrieb" : "Netzbetrieb") . "  [" . V2 . "%]"
      GuiControl, , Tex, %T%
      GuiControl, , Progr, %V2%
   }
}

_batterystatus.ahk
(1.63 KiB) Downloaded 82 times


############################################

ONLINESTATUS v0.1.1
Aus einer GUI und zwei funktionen hab ich eine Funktion zusammengeschraubt.
Angegeben werden muss wieder nichts, aber es kann angegeben werden:

- X-Pos
- Y-Pos
- Fontfarbe Online
- Fontfarbe Offline
- GuiColor

*** CHANGELOG ***
Geändert: If-Abfrage beim GuiControl-Part entfernt
Grund: Weniger code dank Ternary operator

Code: Select all
; _onlinestatus.ahk
; Coded by Obi-Wahn
;
SetTitleMatchMode, 3
#persistent
SetTimer, Stat, 2000
#n::ExitApp
Return

Stat:
Gui, 1:Default
_OnlineStatus()
Return

_OnlineStatus(PosX = "Right", PosY = "Down", FontC_On = "Lime", FontC_Off = "Red", GuiC = "Black") {
   global MyText
   S := (DllCall("Wininet.dll\InternetGetConnectedState", "Str", 0x40, "Int", 0)=1) ? "ONLINE" : "OFFLINE"
   If !WinExist("Online Status ahk_class AutoHotkeyGUI") {
      Gui, Margin, 0,0
      Gui, +LastFound +AlwaysOnTop -Caption +ToolWindow
      Gui, Color, %GuiC%
      Gui, Font, s16
      Gui, Add, Text, vMyText w85 h27 c%FontC_On%, %S%
      WinSet, TransColor, %GuiC%
      X := PosX="Left" ? 0 : (A_ScreenWidth - 85), Y := PosY="Top" ? 0 : (A_ScreenHeight - 27)
      Gui, Show, x%X% y%Y% NoActivate, Online Status
   } Else {
      GuiControl, , MyText, %S%
      Gui, Font, % S="ONLINE" ? "c" . FontC_On : "c" . FontC_Off
      GuiControl, Font, MyText
   }
}

_onlinestatus.ahk
(931 Bytes) Downloaded 87 times
bash.org wrote:<erno> hm. I've lost a machine.. literally _lost_. it responds to ping, it works completely, I just can't figure out where in my apartment it is.

Operative Hektik ist ein ziemlich sicheres Zeichen für zerebrale Windstille...
User avatar
Obi-Wahn
Moderator
 
Posts: 205
Joined: 12.09.2007, 11:43
Location: Wien


Return to Skripts [OpenSource]

Who is online

Users browsing this forum: No registered users and 1 guest

cron