- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何使用 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(¤tMode);
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
关于delphi - 如何使用Delphi检测Windows 10是否处于平板电脑模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56321591/
我正在尝试从 Linux 远程登录到 Windows PC,但显示错误“登录失败”。 这是我的 Python 脚本。我正在使用 pexpect 模块。我也尝试过使用 telnetlib 但同样的错误:
大多人在windows平台用的tomcat都是免安装版本的,很自然想到复制几份目录,就是在同一个电脑上跑多个tomcat服务了。实际上是不可以的。经过如下方法就可以实现统一台服务器(电脑)上运行多个
正负号是一个不常用的符号,很多小伙伴不知道怎么打出来,打出来确实有点麻烦,很多小伙伴不知道怎么弄,今天小编就给大家带来了轻松便捷的方法吧。 正负号怎么打出来 方法1、“&plu
在一项作业中,我被要求创建一个 [7] x [7] 矩阵,以及一个与计算机对战的井字棋游戏。玩家是 X,计算机是 O。[1][1] 是选择 1,[1][3] 是选择 2,[1][5] 是选择 3,[3
我想知道如何开发应用程序/服务器。我的安卓手机会在我说话时录制我的声音,并将其发送到 PC,然后使用 PC 的扬声器播放。 我想我需要一个在计算机上运行的媒体服务器来接收我的声音,然后使用手机上已有的
我正在开发一个使用蓝牙玩的安卓游戏应用程序。在搜索蓝牙设备时,结果包含移动设备和 mac pc/笔记本电脑。我只想在结果列表中列出移动设备。是否可以确定检测到的设备是否为移动设备? 最佳答案 当你有
在学习 Meteor 框架的过程中,我正在将 Yik Yak 移动应用程序重新创建为 Web 应用程序。但该应用程序是完全匿名的,没有用户帐户,但您仍然只能对帖子投赞成票或反对票一次。如何做到这一点?
我花了一些时间寻找解决方案。我已经使用 MacPorts 在我的 mac 上重新安装了 Vim 好几次。 vim --version 命令显示 +clipboard 和 +xterm_clipboar
我是一名优秀的程序员,十分优秀!