gpt4 book ai didi

windows - 检测笔记本电脑盖子是否关闭/集成屏幕是否关闭

转载 作者:可可西里 更新时间:2023-11-01 12:44:10 25 4
gpt4 key购买 nike

是否有 Windows API 可以检测笔记本电脑盖子是否关闭(= 集成笔记本电脑屏幕关闭)?


已经有人问过“相同”的问题:
Get current laptop lid state

虽然( self )接受的答案依赖于在盖子关闭时移除集成屏幕“设备”。但这并不会发生在所有笔记本电脑上。有些屏幕让系统“可用”(实际上不显示任何内容),即使在盖子关闭时也是如此。这意味着 Windows 桌面仍然延伸到关闭的屏幕上(如果“多显示器”设置设置为“扩展这些显示器”)。

我还没有确定,如果这个行为可以被配置或者它是否是特定于驱动程序的:
Remove closed laptop screen from Windows desktop

但即使在这样的系统上,操作系统也知道盖子已关闭,因为它可以在关闭时关闭/休眠机器。并且它广播一个通知(WM_POWERBROADCAST):
Detect laptop lid closure and opening


背景:我有一个应用程序在同一个显示器上启动,上次它是在该显示器上关闭的。如果它在集成笔记本电脑屏幕上关闭并且盖子在下次应用程序启动时关闭(因为用户现在正在使用外部显示器),我的应用程序将在现在不可见的集成笔记本电脑屏幕上启动。

因此我想检测盖子是否关闭并将应用程序强制到外部监视器上。

所以我正在寻找一种方法来检测盖子是否已关闭。或者为了检测特定屏幕关闭的方法(什么是更清洁的解决方案)。

最佳答案

听起来您并不真正关心盖子是否合上,只想知道您要启动应用程序的屏幕区域是否可用。

如果操作系统“仍然为其扩展桌面使用关闭屏幕”,那么这意味着(从操作系统的角度来看)该屏幕可用于应用程序。换句话说——您的应用程序不会是唯一遇到该问题的应用程序。尽管我不得不说我从未亲眼观察到这种特殊行为。

如果您需要在应用程序运行时移动它,那么您可以注册 RegisterPowerSettingNotification 并对其执行操作。

但是,如果您正在启动并且需要知道屏幕是打开还是关闭,您有两个选择:

枚举显示设备

这将为您提供有关您的屏幕是否连接到桌面以及是否处于事件状态的信息。这是您从 User32.dll

中的 API 获得的“系统信息”
DISPLAY_DEVICE ddi;
ddi.cb = sizeof(ddi);
DWORD iDevNum = 0; // or iterate 0..15
EnumDisplayDevices(NULL, iDevNum, &ddi, /*EDD_GET_DEVICE_INTERFACE_NAME*/0);
if( (ddi.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER) == 0 &&
(ddi.StateFlags & DISPLAY_DEVICE_ACTIVE) != 0 ){...}

DXGI (DX11)

这为您提供了与上述基本相同的信息,但采用了更现代的方法(并且可能误报更少)。当然,这需要您链接 DXGI 才能正常工作,并包含会增加应用程序大小的 header :

#include <atltypes.h>

IDXGIAdapter * pAdapter;
std::vector <IDXGIAdapter*> vAdapters;
IDXGIFactory* pFactory = NULL;
// Create a DXGIFactory object.
if(FAILED(CreateDXGIFactory(__uuidof(IDXGIFactory) ,(void**)&pFactory)))
{
return;
}
for(UINT i = 0; pFactory->EnumAdapters(i, &pAdapter) != DXGI_ERROR_NOT_FOUND; ++i){
DXGI_ADAPTER_DESC ad = {0};
if(SUCCEEDED(pAdapter->GetDesc(&ad))){
UINT j = 0;
IDXGIOutput * pOutput;
while(pAdapter->EnumOutputs(j, &pOutput) != DXGI_ERROR_NOT_FOUND)
{
DXGI_OUTPUT_DESC od = {0};
if(SUCCEEDED(pOutput->GetDesc(&od))){
// in here you can access od.DesktopCoordinates
// od.AttachedToDesktop tells you if the screen is attached
}
pOutput->Release();
++j;
}
}
pAdapter->Release();
}

if(pFactory)
{
pFactory->Release();
}

希望对您有所帮助。

Direct3D9

此方法还提供显示信息,但方式略有不同 - 通过适配器列表和连接到这些适配器的监视器。请记住链接 d3d9 库以使其工作:

void d3d_adapterInfo(IDirect3D9 * _pD3D9, UINT _n)
{
D3DADAPTER_IDENTIFIER9 id;
const DWORD flags = 0;
if(SUCCEEDED(_pD3D9->GetAdapterIdentifier(_n, flags, &id))){
// id provides info on Driver, Description, Name
HMONITOR hm = _pD3D9->GetAdapterMonitor(_n);
// and based on that hm you get the same monitor info as
// with the first method
}
}

void d3d_enumDisplays()
{
cout << endl << "--- Information by Direct3D9 ---" << endl;
IDirect3D9 * pD3D9 = Direct3DCreate9(D3D_SDK_VERSION);
const auto nAdapters = pD3D9->GetAdapterCount();
cout << "A total of " << nAdapters << " adapters are listed by Direct3D9" << endl;
for(UINT i = 0; i < nAdapters; ++i){
d3d_adapterInfo(pD3D9, i);
}
pD3D9->Release();
}

所有 3 个代码片段都来 self 的一些项目,因此您只需复制粘贴代码即可,它应该可以正常工作(在我即时修改代码以减少它的过程中,对缺少的函数或变量进行了一些小修复贴在这里时的大小)

关于windows - 检测笔记本电脑盖子是否关闭/集成屏幕是否关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32631314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com