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.
- 1. Schemat bazy danych podobnego systemu
- 2. Wykrywanie systemu Windows lub Linux?
- 3. Korzystanie z uwierzytelniania systemu Windows w asp.net z C#
- 4. Korzystanie z funkcji paska zadań systemu Windows 7 w PyQt
- 5. Porównanie czasu plików wsadowych systemu Windows
- 6. Czy korzystanie z systemu Chronic może osłabić poczucie czasu?
- 7. Korzystanie z widoku debugowania za pomocą usługi systemu Windows
- 8. Skalowanie usług systemu Windows
- 9. Rola braku systemu Windows Azure
- 10. systemu Windows lub aplikacji Local Web App
- 11. Polecenie Synchronizacja systemu plików dla systemu Windows
- 12. Przechwytywanie całego dźwięku systemu Windows?
- 13. Systrace dla systemu Windows
- 14. Korzystanie z podselekcji w celu uzyskania LEWEGO DOŁĄCZENIA
- 15. Programowe uzyskiwanie czasu uruchamiania systemu w języku C++ (Windows)
- 16. Jak zapobiec uruchamianiu systemu Windows przy uruchamianiu systemu Windows?
- 17. Zaawansowane wyszukiwanie plików systemu Windows
- 18. Przetwarzanie dla systemu Android, korzystanie z bibliotek
- 19. Usługa systemu Windows a aplikacja systemu Windows - najlepsza praktyka
- 20. Ręczne uwierzytelnianie systemu Windows
- 21. Usługa wdrażania systemu Windows
- 22. Zapobieganie zamykaniu systemu Windows
- 23. Regex.h dla systemu Windows
- 24. net.tcp nie działa od czasu uaktualnienia do systemu Windows 10
- 25. Foldery instalacji systemu Windows
- 26. Testowanie instalatorów systemu Windows
- 27. Automatyczna aktualizacja usługi systemu Windows
- 28. odpowiednik systemu Windows inet_aton
- 29. Korzystanie z certyfikatów klienta dla systemu Windows RT (Windows 8.1/Windows Phone 8.1)
- 30. Korzystanie z PrincipalSearcher w celu znalezienia użytkowników z "lub" parametrami
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