Verwenden von Golang zum Abrufen der Windows-Leerlaufzeit (GetLastInputInfo o.ä.)

7

Gibt es ein Beispiel oder eine Methode zum Abrufen der Leerlaufzeit eines Windows-Systems mit Go?
 Ich habe mir die Dokumentation auf der Golang-Website angeschaut, aber ich denke, dass ich vermisse, wie man auf die API zugreift (und sie benutzt), um Systeminformationen einschließlich der Leerlaufzeit zu erhalten.

    
Bart Silverstrim 08.04.2014, 22:29
quelle

1 Antwort

21

Gos Website ist fest codiert, um die Dokumentation für die Standard-Bibliothekspakete unter Linux anzuzeigen. Sie müssen Godoc und führen Sie es selbst:

%Vor%

Öffnen Sie dann http://127.0.0.1:6060/ in Ihrem Webbrowser.

Bemerkenswert ist das Paket syscall , das Funktionen für den Zugriff auf Funktionen in DLLs bereitstellt, einschließlich UTF-16-Helfern und Callback-Generierungsfunktionen.

Eine schnelle rekursive Suche in der Go-Struktur führt dazu, dass es speziell für GetLastInputInfo() keine API hat. Wenn also etwas fehlt, sollten Sie diese Funktion direkt von der DLL aus aufrufen können:

%Vor%

Ihr Fall beinhaltet eine Struktur. Soweit ich weiß, können Sie die Struktur einfach neu erstellen (Felder in der gleichen Reihenfolge halten), aber Sie müssen alle int -Felder im Original in int32 konvertieren, andernfalls Dinge werden auf 64-Bit-Windows brechen . Wenden Sie sich an die Seite mit den Windows-Datentypen in MSDN für die entsprechenden Typ-Äquivalente. In Ihrem Fall wäre dies

%Vor%

Da dies (wie so viele Strukturen in der Windows-API) ein cbSize -Feld hat, das erfordert, dass Sie es mit der Größe der Struktur initialisieren, müssen wir dies auch tun:

%Vor%

Jetzt müssen wir nur noch einen Zeiger auf die Variable lastInputInfo an die Funktion übergeben:

%Vor%

und denken Sie daran, syscall und unsafe zu importieren.

Alle Argumente für DLL/LazyDLL.Call() sind uintptr , wie auch die r1 return. Die _ return wird nie unter Windows verwendet (es hat mit dem verwendeten ABI zu tun).

Da ich das meiste von dem, was Sie wissen müssen, um die Windows API in Go zu verwenden, die Sie nicht aus dem Lesen der syscall docs sammeln können, werde ich auch sagen (und das ist für die obige Frage irrelevant) Wenn eine Funktion sowohl ANSI- als auch Unicode-Versionen hat, sollten Sie die Unicode-Versionen ( W suffix) und die UTF-16-Konvertierungsfunktionen im Paket syscall für die besten Ergebnisse verwenden.

Ich denke, das ist alles, was Sie (oder irgendjemanden) benötigen, um die Windows-API in Go-Programmen zu verwenden.

    
andlabs 08.04.2014, 23:54
quelle

Tags und Links