Czy istnieje przykład lub metoda uzyskiwania czasu bezczynności systemu Windows za pomocą funkcji Go?
Przeglądałem dokumentację na stronie Golang, ale myślę, że brakuje mi tego, jak uzyskać dostęp (i używać) do API, aby uzyskać informacje o systemie, w tym o czasie bezczynności.Korzystanie z systemu Golang w celu uzyskania czasu bezczynności systemu Windows (GetLastInputInfo lub podobnego)
Odpowiedz
Strona internetowa firmy Go jest zakodowana na stałe, aby pokazać dokumentację standardowych pakietów bibliotek w systemie Linux. Będziesz musiał dostać godoc i uruchomienia go samodzielnie:
go get golang.org/x/tools/cmd/godoc
godoc --http=:6060
otwórz http://127.0.0.1:6060/
w swojej przeglądarce internetowej.
Na uwagę zasługuje pakiet , który zapewnia funkcje dostępu do funkcji w bibliotekach DLL, w tym pomocników UTF-16 i funkcji generowania wywołań zwrotnych.
wykonując szybkie rekurencyjne przeszukiwanie drzewa Go mówi, że nie ma API dla GetLastInputInfo()
w szczególności, więc chyba jestem brakuje czegoś, powinieneś być w stanie wywołać tę funkcję z biblioteki DLL bezpośrednio:
user32 := syscall.MustLoadDLL("user32.dll") // or NewLazyDLL() to defer loading
getLastInputInfo := user32.MustFindProc("GetLastInputInfo") // or NewProc() if you used NewLazyDLL()
// or you can handle the errors in the above if you want to provide some alternative
r1, _, err := getLastInputInfo.Call(uintptr(arg))
// err will always be non-nil; you need to check r1 (the return value)
if r1 == 0 { // in this case
panic("error getting last input info: " + err.Error())
}
Twój przypadek dotyczy struktury. O ile mi wiadomo, możesz po prostu odtworzyć strukturę płasko (zachowując pola w tej samej kolejności), ale musisz przekonwertować dowolne pola w oryginale na int32
, w przeciwnym razie things will break on 64-bit Windows. Skonsultuj się z Windows Data Types page on MSDN dla odpowiednich odpowiedników typu. W twoim przypadku, to byłoby
var lastInputInfo struct {
cbSize uint32
dwTime uint32
}
Ponieważ (jak tylu kodowanym w API Windows) ma cbSize
pola, które wymaga, aby zainicjować go z wielkością struktury, musimy zrobić tak samo:
lastInputInfo.cbSize = uint32(unsafe.Sizeof(lastInputInfo))
teraz wystarczy przekazać wskaźnik do tej zmiennej lastInputInfo
do funkcji:
r1, _, err := getLastInputInfo.Call(
uintptr(unsafe.Pointer(&lastInputInfo)))
i po prostu pamiętać, aby importować syscall
i unsafe
.
Wszystkie argumenty dotyczące DLL/LazyDLL.Call()
to uintptr
, podobnie jak zwrot r1
. Zwrot z _
nigdy nie jest używany w systemie Windows (ma to związek z używanym ABI).
Odkąd przeszedłem większość tego, co trzeba wiedzieć, aby korzystać z Windows API w Go, że nie można zebrać od czytania syscall
docs, będę również powiedzieć (i to nie ma znaczenia dla powyższej kwestii), że jeśli funkcja ma zarówno wersje ANSI, jak i Unicode, należy użyć wersji Unicode (przyrostek W
) i funkcji konwersji UTF-16 w pakiecie syscall
, aby uzyskać najlepsze wyniki.
Myślę, że to wszystkie informacje, które ty (lub ktokolwiek, jeśli o to chodzi) będą musiały używać interfejsu API Windows w programach Go.
Nie używam nawet okien, ale to było bardzo pouczające. – OneOfOne
Kiedy próbuję pobierać próbki, wracam 1 dla r1. Czy ten wynik mówi, że był to odliczanie 1-krotnego od czasu bezczynności, czy jest to po prostu zwracanie wartości logicznej prawda? Czy powinienem otrzymać czas dwTime? (Dziękuję za wyjaśnienia informacyjne, @andlabs.Myślę, że jestem na dobrej drodze, po prostu brakuje kluczowego zrozumienia, jakie informacje wyciągam.) –
@BartSilverstrim (przepraszam za opóźnienie w odpowiedzi) tak, r1 w tym przypadku jest wartością zwracaną z 'GetLastInputInfo() ', które [zgodnie z MSDN] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646302%28v=vs.85%29.aspx) określa, czy funkcja się powiodła, czy nie. Musisz sprawdzić r1, a jeśli niezerowe, po wywołaniu odbierać 'dwTime' ze swojej struktury, co jest wartością, której naprawdę potrzebujesz. (Zobacz także adnotację '_Out_', która wskazuje, że funkcja zwraca tam wartości.) Jeśli r1 == 0, err będzie zawierać informacje o błędzie (tzn. Wywoływana jest funkcja' GetLastError() '). – andlabs