2014-04-08 14 views

Odpowiedz

21

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

Nie używam nawet okien, ale to było bardzo pouczające. – OneOfOne

+0

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.) –

+1

@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

Powiązane problemy