C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[12]: ForegroundLockTimeoutの取得 [1]


(過去ログ 107 を表示中)

[トピック内 28 記事 (21 - 28 表示)]  << 0 | 1 >>

■63378 / inTopicNo.21)  Re[9]: ForegroundLockTimeoutの取得
  
□投稿者/ Unripe01 (4回)-(2012/08/21(Tue) 15:38:11)
環境はC#.NET win7ですが、結果trueなのにtimeout値は0で取得されます。
質問の根本の解消にはならないかもですが、.NETでやる場合は取得だけレジストリから直接取得するとか・・・

Microsoft.Win32.RegistryKey regkey =
Microsoft.Win32.Registry.CurrentUser.OpenSubKey( @"Control Panel\Desktop\", false );
//REG_DWORD
int intValue = (int)regkey.GetValue( "ForegroundLockTimeout" );


引用返信 編集キー/
■63407 / inTopicNo.22)  Re[9]: ForegroundLockTimeoutの取得
□投稿者/ 魔界の仮面弁士 (36回)-(2012/08/23(Thu) 11:09:30)
No63337 (魔界の仮面弁士) に追記
> Microsoft サポートでは現象を再現できず、とのことでした。
> 本格的に手詰まりです…。

追加報告です。少し状況が進みました。


サポートチームからの調査報告によれば、

・この値は SystemParametersInfo() 呼び出し時に ForegroundLockTimeout レジストリから
 直接取得されるものではなく、win32k.sys 上のグローバルなメモリ領域に格納された値を
 そのまま返す動作となっている。

・ユーザー ログオン直後は SystemParametersInfo() で正しい値が取得できているが、
 一度 Visual Studio 2010 を起動した後で再度SystemParametersInfo() を呼び出した場合、
 期待する値ではなく予期せぬ値が返されるという状況が、Microsoft 側でも確認された。

・この値は Visual Studio 2010 を起動しなおす度に異なる値が取得されている。

であるとのことです。


なお、VSの問題であるのかどうかまでは現段階では分かっておりません。
何が影響しているのかを厳密に特定できてはいないため、この件については
引き続き Microsoft 側でも調査を進めてもらっています。

今回の調査結果を受けて、当方においても

・SPI_GETFOREGROUNDLOCKTIMEOUT を呼び出すアプリを用意する。
 (最初に提示したコード)

・Windows へのログオン直後に、そのアプリから正常な値を得られるか。

・その後 Visual Studio を起動した後で、同アプリから同じ値が得られるか。

を何パターンか実施し、後程こちらに結果を報告させていただきます。


なお可能であれば、当方以外の第三者環境での結果も知りたいので、
もしも調査にご協力いただける方がいらっしゃいましたら、上記結果を
OSバージョン/VSバージョンと共に教えて頂けると幸いです。
引用返信 編集キー/
■63410 / inTopicNo.23)  Re[10]: ForegroundLockTimeoutの取得
□投稿者/ とっちゃん (2回)-(2012/08/23(Thu) 11:31:52)
とっちゃん さんの Web サイト
No63407 (魔界の仮面弁士 さん) に返信
試してみました。

OSは、Win7x64(パッチは最新状態)。プログラムは影響範囲を最小限とするため、Native(CRTはスタティックリンク)で、UNICODE版。
ビルドはVS2010です。

で、当然VS2010を起動してプログラムを作成したので最初から値おかしいわけですが...
ソースは、これ(ヘッダーとかは書いてませんのでこのままじゃビルド通らないのであしからず)

void _tmain()
{
 DWORD value = 0;
 SystemParametersInfo( SPI_GETFOREGROUNDLOCKTIMEOUT, 0, &value, FALSE );
 wcout << value << endl;
}

プログラムを作成して実行できることをまず確認。既に値がおかしい状態で取得(テスト環境では3404916)。
VSを終了してコンソールで実行(3404916)。
改めてVS2010を起動(違う結果:3470076)。
VSを終了して実行(3470076)。
VS2012を起動(違う結果:3859448)。
2012を終了して実行(3859448)。

参考のため、VS2005/2008 を実行してみたところ変わらず。
ということで、VS2010から仕込んでしまった何らかの影響のようです。

Win8(RTM) + VS2012(RTM) 環境もあるのでこちらも試してみました。

手順。
OS起動。
作成済みのEXEをコピー。
コンソールを開く。
EXE実行。結果:200000
VS2012実行。
EXE実行。結果:3596880
でした。

VSを起動しなおすたびに値が書き換わっているので、起動シーケンスの何かで参照値を書き換えてしまうものと思います。

引用返信 編集キー/
■63414 / inTopicNo.24)  Re[10]: ForegroundLockTimeoutの取得
□投稿者/ Unripe01 (9回)-(2012/08/23(Thu) 13:47:55)
No63407 (魔界の仮面弁士 さん) に返信

OS:Win7Pro SP1 32bit
ビルド:VS2010 Team Edition
レジストリのForegroundLockTimeout の値:20003

VS起動時に予期しない値が入るということで
タイミング別に試してみました。

コードは以下のままです。
UInt32 oldValue = /* dummy value*/ 5678;
SystemParametersInfo( SPI_GETFOREGROUNDLOCKTIMEOUT, 0u, out oldValue, 0u ); // ☆ア
Console.WriteLine( "0x{0:X8} ({0:G})", oldValue );

張り付けられているURLのソースコードをコピペし、ビルドしました。


実行結果

1.OS 起動直後 ビルドしたEXEを実行
0x00004E23 (20003)

2.VS2010 起動直後 ビルドしたEXEを実行
0x00004E23 (20003)

3.VS2010で、Rereaseデバッグ「無し」で実行した結果
0x00004E23 (20003)

4.VS2010で、Rereaseデバッグ「有り」で実行した結果
0x0000000(0)

5.4の後、ビルドしたEXEを実行
0x0000000(0)

というわけで、デバッグ実行時以降に値が変わっている事を確認しました。



引用返信 編集キー/
■63418 / inTopicNo.25)  Re[11]: ForegroundLockTimeoutの取得
□投稿者/ 渋木宏明 (14回)-(2012/08/23(Thu) 16:31:08)
渋木宏明 さんの Web サイト
いくら Visual Studio でも、カーネルのワーク領域を直接書き換えられるとは思えないなぁ。

デバッガ周りの API とかどっか OS 側のバグでワークを破壊しているような気が。。。

引用返信 編集キー/
■63440 / inTopicNo.26)  Re[10]: ForegroundLockTimeoutの取得
□投稿者/ 魔界の仮面弁士 (39回)-(2012/08/25(Sat) 18:12:31)
No63407 (魔界の仮面弁士) に追記
> 今回の調査結果を受けて、当方においても
> を何パターンか実施し、後程こちらに結果を報告させていただきます。

皆さん、ありがとうございます。当方で試した限りでは、
  VS2010 / 2012 の実行後に、SPI_GETFOREGROUNDLOCKTIMEOUT から
  返される値が破損する『ことがある』
という曖昧な結果になりました。


以下、実験結果です。

============================
今回は、「VB6」(Native/P-Code) および
「C#4 on .NET 2.0」(AnyCPU/x86, Debug/Release)
という、6 種の EXE を用意した上での実験してみました。

その結果、開発環境を起動してからのデバッグ実行等ではなく、
コンパイルされた EXE を単に実行するだけであれば、
VB6 や .NET といった環境の差異は受けないようです。

また、SystemParametersInfo の戻り値はいずれも TRUE(1)固定、
Err.LastDllError / Marshal.GetLastWin32Error も常に 0 でした。
---------------------------

☆の行は、MSサポートからの報告と一致する点、
★の行は、今回新たに発生した事象です。

Visual Studio は単にスタートメニューから起動しただけで、
プロジェクトを開いたり作成したりといった作業は行っていません。


【Windows 7 Enterprise, x64 / Service Pack 1】
【VS2005 Team Suite / Service Pack 1 Update for Windows Vista】8.0.50727.867 (vsvista.050727-8600)
【VS2008 Development Edition / Service Pack 1 with QFE】9.0.30729.4462 QFE
【VS2010 Ultimate / Service Pack 1】10.0.40219.1 SP1Rel
 ・OS 起動直後は、6 種の EXE いずれもレジストリ値「20000(0x4e20)」を返してきた。
 ・VS2005 起動(1回目)。期待値である「20000(0x4e20)」のまま。終了後も同値のまま。
 ・VS2008 起動(1回目)。期待値である「20000(0x4e20)」のまま。終了後も同値のまま。
 ☆VS2010 起動(1回目)。別の破損値「1635708(0x18f57c)」に変化。終了後も同値。
 ★VS2010 起動(2回目)。上記破損値「1635708(0x18f57c)」のまま。終了後も同値のまま。
 ★VS2010 起動(3回目)。上記破損値「1635708(0x18f57c)」のまま。終了後も同値のまま。
 ・OS のログオフ後に再ログオンしたところ、元通り「20000(0x4e20)」を返してきた。
 ★VS2010 起動(1回目)。期待値である「20000(0x4e20)」のまま。終了後も同値のまま。
 ・VS2005 起動(1回目)。期待値である「20000(0x4e20)」のまま。終了後も同値のまま。
 ・VS2008 起動(1回目)。期待値である「20000(0x4e20)」のまま。終了後も同値のまま。
 ★VS2010 起動(2回目)。期待値である「20000(0x4e20)」のまま。終了後も同値のまま。
 ・VS2005 起動(2回目)。期待値である「20000(0x4e20)」のまま。終了後も同値のまま。
 ・VS2008 起動(2回目)。期待値である「20000(0x4e20)」のまま。終了後も同値のまま。
 ☆VS2010 起動(3回目)。別の破損値「1503844(0x16f264)」に変化。終了後も同値。
 ☆VS2010 起動(4回目)。別の破損値「1635852(0x18f60c)」に変化。終了後も同値。
 ・再度、ログオフとログオンを実行。今度は起動後、HDDが落ち着くまでしばらく待つ。
 ・この時点ではいずれもレジストリ値「20000(0x4e20)」を返す状態。
 ・VS2005 起動(1回目)。期待値である「20000(0x4e20)」のまま。終了後も同値のまま。
 ・VS2008 起動(1回目)。期待値である「20000(0x4e20)」のまま。終了後も同値のまま。
 ☆VS2010 起動(1回目)。別の破損値「3863524(0x3af3e4)」に変化。終了後も同値。
 ☆VS2010 起動(2回目)。別の破損値「1636532(0x18f8b4)」に変化。終了後も同値。
 ★VS2010 起動(3回目)。上記破損値「1636532(0x18f8b4)」のまま。終了後も同値のまま。



【Windows 7 Ultimate, x64 / Service Pack 1】
【VS2010 Ultimate / Service Pack 1】10.0.40219.1 SP1Rel
【VS2012 Ultimate / RTM】11.0.50727.1 RTMREL
 ・OS 起動直後は、6 種の EXE いずれもレジストリ値「0(0x0)」を返してきた。
 ・VS2012 起動(1回目)。別の破損値「1434656(0x15e420)」に変化。終了後も同値。
 ・再度、ログオフとログオンを実行。SSD が落ち着くまで少し待つ。
 ・この時点では、レジストリの期待値「0(0x0)」を返している。
 ☆VS2010 起動(1回目)。別の破損値「3601620(0x36f4d4)」に変化。終了後も同値。
 ・VS2012 起動(1回目)。別の破損値「2744824(0x29e1f8)」に変化。終了後も同値。
 ★VS2010 起動(2回目)。上記破損値「2744824(0x29e1f8)」のまま。終了後も同値のまま。
 ・VS2012 起動(2回目)。別の破損値「3859744(0x3ae520)」に変化。終了後も同値。
 ・再度、ログオフとログオンを実行。SSD が落ち着くまで少し待つ。
 ・この時点では、レジストリの期待値「0(0x0)」を返している。
 ☆VS2010 起動(1回目)。別の破損値「3273300(0x31F254)」に変化。終了後も同値。
 ★VS2010 起動(2回目)。上記破損値「3273300(0x31F254)」のまま。終了後も同値のまま。
 ☆VS2010 起動(3回目)。別の破損値「2617836(0x27f1ec)」に変化。終了後も同値。


【Windows 8 Pro, x64 / RTM】
【Visual Studio 未インストール】
 ・OS 起動直後、VB6 版はレジストリ値「20000(0x4e20)」を返してきた。
  (.NET 2.0 版は、.NET Framework 3.5 未インストール環境のため稼働せず)


【Windows 8 Release Preview, x64】
【VS2012 Ultimate / Release Candidate】11.0.50522.1 RCREL
 ・OS 起動直後は、6 種の EXE いずれもレジストリ値「20000(0x4e20)」を返してきた。
 ・VS2012 起動(1回目)。期待値である「20000(0x4e20)」のまま。終了後も同値のまま。
 ・VS2012 起動(2回目)。別の破損値「4122904(0x3ee918)」に変化。終了後も同値。
 ・VS2012 起動(3回目)。別の破損値「7856608(0x77e1e0)」に変化。終了後も同値。
 ・VS2012 起動(4回目)。別の破損値「13625560(0xcfe8d8)」に変化。終了後も同値。
 ・VS2012 起動(5回目)。別の破損値「10610760(0xa1e848)」に変化。終了後も同値。

引用返信 編集キー/
■63484 / inTopicNo.27)  Re[11]: ForegroundLockTimeoutの取得
□投稿者/ 魔界の仮面弁士 (41回)-(2012/08/31(Fri) 18:16:44)
No63440 (魔界の仮面弁士) に追記

Microsoft から調査結果報告がありました。

結論としては、Visual Studio 2010 および Visual Studio 2012 の不具合であり、
SystemParametersInfo() で、「値」を渡すべきところで「ポインタ」を渡しているため、
VS を起動することで、呼び出し後の設定値が不定となっていたようです。

Visual Studio 2010/2012 への SP/Hotfix が提供される予定は、現時点では未定ですが、
少なくとも VS2012 の次のバージョンの Visual Studio での修正は行われるとのことです。


現時点では、VS2010/2012を起動しないという対応策しか無いわけですが、
一応結論が出たという事で、解決済みマークを付けておきます。

# 今回の対象は .NET 2.0 だし、VS2005/20058 で作り直そうかな…。
解決済み
引用返信 編集キー/
■63703 / inTopicNo.28)  Re[12]: ForegroundLockTimeoutの取得
□投稿者/ 魔界の仮面弁士 (61回)-(2012/09/28(Fri) 16:32:49)
No63484 (魔界の仮面弁士 さん) に返信
> 結論としては、Visual Studio 2010 および Visual Studio 2012 の不具合であり、
> SystemParametersInfo() で、「値」を渡すべきところで「ポインタ」を渡しているため、
> VS を起動することで、呼び出し後の設定値が不定となっていたようです。

本件に関して、技術サポートチームに FAST PUBLISH(緊急公開)版の KB を
作成・公開していただいたので、情報共有のために投稿しておきます。


【Visual Studio 2012 または Visual Studio 2010 を起動すると
 SPI_GETFOREGROUNDLOCKTIMEOUT フラグを指定し取得される
 システム パラメーターの値が変化する】

http://support.microsoft.com/?id=2763075


もし、ForegroundLockTimeout が変更されることで悪影響がある場合には、
VS2010/2012 が修正されるまでの間、VS起動後に SystemParametersInfo を
呼び出して補正するようなツールを用意することで、暫定回避できるかと思います。
解決済み
引用返信 編集キー/

<前の20件
トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -