tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルSPI_SETFOREGROUNDLOCKTIMEOUTについて
記事No13285
投稿日: 2008/12/12(Fri) 13:29
投稿者ミリ
VB6SP6 WindowsXP SP2 なのですが

Public Declare Function SystemParametersInfo Lib "USER32" Alias "SystemParametersInfoA" (ByVal uiAction As Long, ByVal uiParam As Long, ByRef pvParam As Long, ByVal fWinIni As Long) As Long

Public Const SPI_GETFOREGROUNDLOCKTIMEOUT As Long = &H2000&
Public Const SPI_SETFOREGROUNDLOCKTIMEOUT As Long = &H2001&

Dim bRtn As Long
Dim lTime As Long

bRtn = SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, lTime, 0)
bRtn = SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0)
bRtn = SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, lTime, 0)
bRtn = SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, lTime, 0)

のようなコードを実行してロックアウトタイムを変更しようといたのですが
最後の再度取得を実行してみると1305288という値が入っておりました。

最初GETしたときはデフォルトの200000が入っていました。
その後は0をSETしても他の値をSETしてみても再度GETすると1305288・・・
関数の戻りは正常の1でした。

何か原因が分かりますでしょうか?
以上よろしくお願いします。

[ツリー表示へ]
タイトルRe: SPI_SETFOREGROUNDLOCKTIMEOUTについて
記事No13286
投稿日: 2008/12/12(Fri) 14:28
投稿者魔界の仮面弁士
Get 時には、変数の参照を渡しますが、
Set 時には、値そのものを渡さねばなりません。SDK で確認しておいてください。

VB6 的に言えば、前者は「Long 型変数の ByRef 渡し」または「VarPtr の ByVal 渡し」、
後者は「Long 値の ByVal 渡し」です。


今回の場合は、Declare 宣言を「ByRef pvParam As Long」で行っていますので、
 'bRtn = SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0)
  bRtn = SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, ByVal 0&, 0)
そして
  'bRtn = SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, lTime, 0)
  bRtn = SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, ByVal lTime, 0)
とする必要があるでしょう。


> 最後の再度取得を実行してみると1305288という値が入っておりました。
ポインタですね。変数のアドレス値がそのまま設定されたのでしょう。

おそらく、それを実行した時点の
  Debug.Print VarPtr(lTime)
の値が、1305288 だったのだと思いますよ。

[ツリー表示へ]
タイトルRe^2: SPI_SETFOREGROUNDLOCKTIMEOUTについて
記事No13287
投稿日: 2008/12/12(Fri) 15:41
投稿者ミリ
詳しい返信ありがとうございます。

どこかのサンプルを参考にしたのですが
それがまずかったみたいです。

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

[ツリー表示へ]