タイトル : Re: OSのアイドル時間を取得したい 投稿日 : 2007/03/05(Mon) 11:52 投稿者 : 魔界の仮面弁士
> Structure LASTINPUTINFO > Dim cbSize As Long > Dim dwTime As Long > End Structure 本来、cbSize は UINT 型、dwTime は DWORD 型ですので、VB2005 から使う場合は、 両メンバとも、As UInteger に変更しておいてください。As Long では動作しません。 # VB6 と VB2005 では、型のサイズが変更されています。As Long ×2 な構造体というのは、 # VB6 的には、As Currency×2 なユーザー定義型に相当するサイズになってしまいますよ。 > ' 最後に発生した入力イベントの時刻を取得する関数の宣言 > Declare Function GetLastInputInfo Lib "user32.dll" (ByVal Plii As LASTINPUTINFO) As Integer 引数が ByVal になっていますが、ここは ByRef にすべきかと。 この API の引数が、LASTINPUTINFO 型ではなく、PLASTINPUTINFO 型を受け取ることに 注意して下さい。つまり、LASTINPUTINFO 構造体へのポインタが要求される、ということです。 もし、LASTINPUTINFO を Class として定義しているのであれば、ByVal 引数で良いのですが、 今回は Structure として定義しているのですから、引数は ByRef とする必要があるでしょう。 # VB6 では、ByVal/ByRef を省略したには ByRef とみなされる仕様になっていましたが、 # VB2005 では、ByVal/ByRef を省略すると、ByVal として補正されるようになっています。 そこまで修正しても駄目なら、GetLastInputInfo の呼び出し前に、cbSize メンバに 正しい構造体サイズを設定するのを忘れていないかをチェックしてみてください。 > lngResult = GetLastInputInfo(udtLastInputInfo) API の戻り値を Integer として Declare 宣言しているのに、 その値を受けとる変数名の接頭辞が lng というのも、如何なものかと…。(^^; で、GetLastInputInfo API の戻り値は本来、BOOL 型(これは32bit整数型です)なので、 As Integer や As UInteger で受け取るというのは OK です。(VB6なら、As Long ですね) あるいは、GetLastInputInfo の Declare 宣言の戻り値の型については、本来の意図を組んで As <MarshalAs(UnmanagedType.Bool)> Boolean とすることもできます。 # この場合は、「Imports System.Runtime.InteropServices」を忘れずに。 |