tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルOSのアイドル時間を取得したい
記事No5055
投稿日: 2007/03/05(Mon) 11:14
投稿者TIFBLUE
VB2005にてVB6.0アプリを作り変えているところなのですが。
VB6.0で行っていたOSのアイドル時間の取得がVB2005では出来なくて苦しんでいます。
VB6.0ではGetLastinputinfo APIを使って取得していました。
VB2005でも同様に取得したいと思ってコードを移植したのですが
構造体パラメータの値が絶えずゼロで戻ってきます。
VB2005では無理なのでしょうか・・・

以下 モジュール内で定義

' 最後に発生した入力イベントの時刻を取得する関数の宣言
Declare Function GetLastInputInfo Lib "user32.dll" (ByVal Plii As LASTINPUTINFO) As Integer

    ' 最後に発生した入力イベントの時刻を定義する構造体の宣言
    Structure LASTINPUTINFO
        Dim cbSize As Long
        Dim dwTime As Long
    End Structure


以下フォームクラス内
        Dim udtLastInputInfo As LASTINPUTINFO
        ' 最後に入力が行われた時刻を取得
        lngResult = GetLastInputInfo(udtLastInputInfo)

[ツリー表示へ]
タイトルRe: OSのアイドル時間を取得したい
記事No5056
投稿日: 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」を忘れずに。

[ツリー表示へ]
タイトルRe^2: OSのアイドル時間を取得したい
記事No5057
投稿日: 2007/03/05(Mon) 11:59
投稿者TIFBLUE
魔界の仮面弁士さま ありがとうございます。

実は、ただ今移植の真っ只中にいたもので変数名等はVB6.0時のまま使っていました。
とりあえず自環境にて動作するかしないかを急いでいたためでした。

すいません。 ご教授頂いた内容にて動作確認していきたいと思います。
追ってご報告したいと思います。

[ツリー表示へ]
タイトルRe^2: OSのアイドル時間を取得したい
記事No5058
投稿日: 2007/03/05(Mon) 12:25
投稿者TIFBLUE
> そこまで修正しても駄目なら、GetLastInputInfo の呼び出し前に、cbSize メンバに
> 正しい構造体サイズを設定するのを忘れていないかをチェックしてみてください。

ここの部分のサイズ設定をし忘れていたため構造体サイズをゼロとなっていました。
まだまだ、VB6.0からの変更に追いついていないことを改めて実感する次第です。。。

ありがとうございました。

[ツリー表示へ]