5

スライド ショーを実行するために、スクリーン セーバーを一時的に無効にするアプリケーションがあります。これを使用してオンまたはオフにします。

i = SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, active, Nothing, SPIF_SENDWININICHANGE)

これは XP では問題なく動作します。Windows 7 では、スクリーン セーバーを適切に無効にします。ただし、再度有効にすると、通常はスクリーン セーバーがオンになるときに、システムはスクリーン セーバーを表示する代わりにパスワードを要求します。

以降、操作パネルでスクリーンセーバーの設定を変更するまでの間、スクリーンセーバーの代わりにパスワード画面が表示されます。

Windows 7 で他にすべきことはありますか? SPI_GETSCREENSAVEACTIVE が Windows 7 でサポートされていないことは理解していますが、SPI_SETSCREENSAVEACTIVE はサポートされるはずです。

4

2 に答える 2

5

解決策は、SystemParametersInfo を使用する代わりに、レジストリ値 HKCU\Control Panel\Desktop ScreenSaveActive キーを変更することです。これは、XP と Windows 7 の両方で機能します。

Call Registry.SetValue("HKEY_CURRENT_USER\Control Panel\Desktop", "ScreenSaveActive", "1")
于 2010-01-19T05:08:51.493 に答える
4

この状況で以前に行ったことは、スクリーンセーバーを無効にするのではなく、スクリーンセーバーが起動しないようにすることです。これを行うには、定期的に (タイマーで) 「左シフトアップ」キーストロークを OS に送信します。

c#:

[DllImport("user32")]
private static extern void keybd_event(byte bVirtualKey, byte bScanCode, int dwFlags, int dwExtraInfo);

private const byte VK_LSHIFT = 0xA0;
private const int KEYEVENTF_KEYUP = 0x0002;

// When the timer elapses, send Left Shift Up
private void timer1_Tick(object sender, EventArgs e)
{
    keybd_event(VK_LSHIFT, 0x45, KEYEVENTF_KEYUP, 0);
}

vb.net:

Private Const VK_LSHIFT As Byte = 160

Private Const KEYEVENTF_KEYUP As Integer = 2

Private Declare Sub keybd_event Lib "user32" (ByVal bVirtualKey As Byte, ByVal bScanCode As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)

' When the timer elapses, send Left Shift Up
Private Sub timer1_Tick(ByVal sender As Object, ByVal e As EventArgs)
    keybd_event(VK_LSHIFT, 69, KEYEVENTF_KEYUP, 0)
End Sub

(私は vb 開発者ではありません。自動化された c# -> vb.net コンバーターを介して c# コードを実行しただけです)

Left Shift Up キーストロークは、アプリケーションに干渉する可能性が最も低いと考えています。起こりうる最悪の事態は、タイマーが起動するのとまったく同じタイミングで左シフトを押した場合、シフトが終了することです。

もちろん、他のキーを使用してスクリーン セーバーがアクティブにならないようにすることもできます。

于 2010-01-18T21:02:20.143 に答える