スリープ抑止C#版
丸写しではあるけど、一度動作させてみます。
元はこちらなんですけど、このままじゃ動かなくて、ハマったので・・・。
https://variedtastefinder.jp/blog/?p=1567
まず
using?System.Runtime.InteropServices;
が必要で、これを入れないとDllImportでエラーになってしまいます。
また暗転防止でSetThreadExecutionStateを使っているのですが宣言がありません。
[DllImport(“kernel32.dll")]
extern?static?ExecutionState?SetThreadExecutionState(ExecutionState esFlags);
このように書くことでOKでした。
using?System; using?System.Collections.Generic; using?System.Drawing; using?System.Windows.Forms; using?System.Runtime.InteropServices; namespace?c_nosleep{ public?partial?class?MainForm : Form{ [FlagsAttribute] public?enum?ExecutionState :?uint{ // 関数が失敗した時の戻り値 Null =?0, // スタンバイを抑止 SystemRequired =?1, // 画面OFFを抑止 DisplayRequired =?2, // 効果を永続させる。ほかオプションと併用する。 Continuous =?0x80000000, } [DllImport("kernel32.dll")] extern?static?ExecutionState?SetThreadExecutionState(ExecutionState esFlags); [DllImport("user32.dll")] extern?static?uint?SendInput( uint?nInputs,???// INPUT 構造体の数(イベント数) INPUT[]?pInputs,???// INPUT 構造体 int?cbSize?????// INPUT 構造体のサイズ ); [StructLayout(LayoutKind.Sequential)] struct?INPUT{ public?int?type;??// 0 = INPUT_MOUSE(デフォルト), 1 = INPUT_KEYBOARD public?MOUSEINPUT mi; } [StructLayout(LayoutKind.Sequential)] struct?MOUSEINPUT{ public?int?dx; public?int?dy; public?int?mouseData;??// amount of wheel movement public?int?dwFlags; public?int?time;??// time stamp for the event public?IntPtr dwExtraInfo; } // dwFlags const?int?MOUSEEVENTF_MOVED =?0x0001; const?int?MOUSEEVENTF_LEFTDOWN =?0x0002;??// 左ボタン Down const?int?MOUSEEVENTF_LEFTUP =?0x0004;??// 左ボタン Up const?int?MOUSEEVENTF_RIGHTDOWN =?0x0008;??// 右ボタン Down const?int?MOUSEEVENTF_RIGHTUP =?0x0010;??// 右ボタン Up const?int?MOUSEEVENTF_MIDDLEDOWN =?0x0020;??// 中ボタン Down const?int?MOUSEEVENTF_MIDDLEUP =?0x0040;??// 中ボタン Up const?int?MOUSEEVENTF_WHEEL =?0x0080; const?int?MOUSEEVENTF_XDOWN =?0x0100; const?int?MOUSEEVENTF_XUP =?0x0200; const?int?MOUSEEVENTF_ABSOLUTE =?0x8000; const?int?screen_length =?0x10000;??// for MOUSEEVENTF_ABSOLUTE (この値は固定) public?MainForm(){ InitializeComponent(); } void?Timer1Tick(object?sender,?EventArgs e){ //画面暗転阻止 SetThreadExecutionState(ExecutionState.DisplayRequired); // ドラッグ操作の準備 (struct 配列の宣言) INPUT[]?input =?new?INPUT[1];??// イベントを格納 // ドラッグ操作の準備 (イベントの定義 = 相対座標へ移動) input[0].mi.dx =?0;??// 相対座標で0 つまり動かさない input[0].mi.dy =?0;??// 相対座標で0 つまり動かさない input[0].mi.dwFlags = MOUSEEVENTF_MOVED; // ドラッグ操作の実行 (イベントの生成) SendInput(1,?input,?Marshal.SizeOf(input[0])); } } }
これを実行している間は自動スリープにはならないことを確認しました。
ところが操作してスリープを実行した際には流石にスリープしてしまいます。
これも拒否できたらすごかったのですが・・・。
でもちょっと考えてみたいですね。
ディスカッション
コメント一覧
まだ、コメントがありません