gpt4 book ai didi

delphi - 如何使用Delphi检测Windows 10是否处于平板电脑模式?

转载 作者:行者123 更新时间:2023-12-02 07:56:11 26 4
gpt4 key购买 nike

如何使用 Delphi 代码检测用户何时在 Windows 10 设备上进入平板电脑模式?

有人可以展示一个代码示例吗?

我不想检测用户是否有平板电脑。我只是想看看它们是否处于平板电脑模式。最好的方法是什么?

最佳答案

我删除了之前的变体(基于[SO]: How can I detect when Windows 10 enters tablet mode in a Windows Forms application? (@CheeseLover's answer)(由@Remko的评论指出)),因为这是一个完全不同的场景(与在桌面上运行的Win没有任何关系) .

我花了一些时间在[MS.DevBlogs]: Raymond - How can I detect whether my PC is in tablet mode?上(@RitaHan-MSFT 的回答 (+1) 中指出),并且显然,这就是要走的路

我不知道如何将代码“翻译”到 Delphi 中,自从我在其中编写大量代码以来已经过去了很多年(但我确信这是可能的),所以我做了退而求其次的事情:编写了一个从 Delphi 调用的 C++ .dll(包含 Raymond 代码的修改/改进版本)。

注意:构建.dll需要VStudio,我使用2015 Community版本,这是免费的,可以从[VStudio]: Visual Studio 2015 and other Products下载(不过您需要一个MS帐户)。

dll.cpp:

#include <wrl/client.h>
#include <windows.ui.viewmanagement.h>
#include <UIViewSettingsInterop.h>
#include <wrl/wrappers/corewrappers.h>


namespace WRL = Microsoft::WRL;
namespace VM = ABI::Windows::UI::ViewManagement;


class Backend {
public:
static Backend &instance()
{
static Backend m_instance;
return m_instance;
}

WRL::ComPtr<IUIViewSettingsInterop> interop() {return m_interop;}

private:
Backend()
{
HRESULT res = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
m_comInit = (res == S_OK) || (res == S_FALSE);
if (m_comInit || (res == RPC_E_CHANGED_MODE)) {
res = Windows::Foundation::GetActivationFactory(WRL::Wrappers::HStringReference(
RuntimeClass_Windows_UI_ViewManagement_UIViewSettings).Get(), &m_interop);
}
}

Backend(const Backend &other) = delete;
Backend &operator =(const Backend &other) = delete;

~Backend()
{
if (m_interop) {m_interop.Reset();}
if (m_comInit) {CoUninitialize();}
}

bool m_comInit = false;
WRL::ComPtr<IUIViewSettingsInterop> m_interop = nullptr;
};


/*!
Gets Tablet mode value.
\param hwnd Window handle to get the mode for
\returns:
1 - Tablet mode ON
0 - Tablet mode OFF
-X - Error
*/
extern "C" __declspec(dllexport) int GetTabletMode(HWND hwnd)
{
WRL::ComPtr<IUIViewSettingsInterop> interop = Backend::instance().interop();
if (!interop) {
return -3;
}

WRL::ComPtr<VM::IUIViewSettings> viewSettings;
HRESULT res = interop->GetForWindow(hwnd != NULL ? hwnd : GetConsoleWindow(), IID_PPV_ARGS(&viewSettings));
if (!viewSettings) {
return -2;
}

VM::UserInteractionMode currentMode;
res = viewSettings->get_UserInteractionMode(&currentMode);

int ret = -1;
switch (currentMode) {
case VM::UserInteractionMode_Mouse: ret = 0; break;
case VM::UserInteractionMode_Touch: ret = 1; break;
default: ret = -1;
}

viewSettings.Reset();
return ret;
}

下面是 Delphi 相关代码(只有单元,因为其余部分很容易制造,没有必要将其全部放在这里)。

Unit0.pas:


unit Unit0;

interface

uses
Forms, Dialogs, Controls, StdCtrls, Classes;


type
TForm0 = class(TForm)
CheckButton: TButton;
procedure CheckButtonClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form0: TForm0;


function GetTabletMode(hwnd: THandle): Integer cdecl; external 'TabletUtils.dll';


implementation

{$R *.dfm}

procedure TForm0.CheckButtonClick(Sender: TObject);
var
TabletModeStr: String;
begin
case GetTabletMode(Self.Handle) of
0 : TabletModeStr := 'OFF';
1 : TabletModeStr := 'ON';
else TabletModeStr := 'ERROR';
end;
MessageDlg('Tablet Mode: ' + TabletModeStr, mtInformation, [mbOK], 0);
end;

end.

输出:


[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q056321591]> sopr.bat
### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ###

[prompt]> "c:\Install\x86\Microsoft\Visual Studio Community\2015\vc\vcvarsall.bat" x86

[prompt]> dir /b
App0.cfg
App0.dof
App0.dpr
App0.exe
App0.res
dll.cpp
other
Unit0.dcu
Unit0.ddp
Unit0.dfm
Unit0.pas

[prompt]> cl /nologo /DDLL /DNDEBUG /DUSRDLL /D_WINDOWS /MT dll.cpp /link /NOLOGO /DLL /OUT:TabletUtils.dll ole32.lib runtimeobject.lib
dll.cpp
Creating library TabletUtils.lib and object TabletUtils.exp

[prompt]> dir /b
App0.cfg
App0.dof
App0.dpr
App0.exe
App0.res
dll.cpp
dll.obj
other
TabletUtils.dll
TabletUtils.exp
TabletUtils.lib
Unit0.dcu
Unit0.ddp
Unit0.dfm
Unit0.pas

[prompt]> App0.exe

[prompt]>

在下面的屏幕截图中,我运行了该应用程序:

  • 在我的笔记本电脑(Win 10)上,桌面模式(右侧)

  • Win 10虚拟机上使用平板电脑模式(左侧)。请注意,我必须复制:

    • App0.exe

    • TabletUtils.dll

Img0

关于delphi - 如何使用Delphi检测Windows 10是否处于平板电脑模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56321591/

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