tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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」を忘れずに。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。