这段代码(在Delphi 7下编译)在XP和Win7下运行得很好:
var
_SetSuspendState: function (Hibernate, ForceCritical, DisableWakeEvent: BOOL): BOOL stdcall;
// Hibernate: SetSuspendState(True , False, False);
// Standby : SetSuspendState(False, False, False);
function SetSuspendState(Hibernate, ForceCritical, DisableWakeEvent: Boolean): Boolean;
function LinkAPI(const module, functionname: string): Pointer;
...
function LinkAPI(const module, functionname: string): Pointer;
var
hLib: HMODULE;
begin
hLib := GetModulehandle(PChar(module));
if hLib = 0 then
hLib := LoadLibrary(PChar(module));
if hLib <> 0 then
Result := getProcAddress(hLib, PChar(functionname))
else
Result := nil;
end;
function SetSuspendState(Hibernate, ForceCritical, DisableWakeEvent: Boolean): Boolean;
begin
if not Assigned(_SetSuspendState) then
@_SetSuspendState := LinkAPI('POWRPROF.dll', 'SetSuspendState');
if Assigned(_SetSuspendState) then
Result := _SetSuspendState(Hibernate, ForceCritical, DisableWakeEvent)
else
Result := False;
end;但是如何使它在Windows 10下工作呢?
如果我在Win10 TabletPC上测试它(通过调用:SetSuspendState(False, False, False); ),设备将完全关闭。
Update2:
还试图发送一个虚拟的“睡眠”按钮:
const
VK_SLEEP = $5F;
begin
keybd_event(VK_SLEEP, 0, 0, 0);
Application.ProcessMessages;
keybd_event(VK_SLEEP, 0, KEYEVENTF_KEYUP, 0);
Application.ProcessMessages;但是应用程序的OnKeyDown事件无法捕获它,就像它从未被发送过一样。
Update3:
在过去几天对这个问题进行了彻底的调查之后,我意识到以下几点:
概述:
因此,我的第一段代码基本上受到电源配置以及Win10驱动程序和操作系统问题的影响。
这就是为什么我认为唯一的解决方案是通过简单的模拟“键盘-睡眠-按键”(就像我在‘Update2’中尝试过的那样)来绕过整个问题。
发布于 2019-09-23 17:52:17
在这一专题上得出了同样的结论:
programmatically-enter-connected-standby-in-c-sharp
解决方案是发送监视器关闭信号:
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
https://stackoverflow.com/questions/57888044
复制相似问题