【发布时间】:2021-05-05 04:24:38
【问题描述】:
在 Win 10 Ent IoT 触摸屏平板电脑上运行了一个应用程序,用于调整 LED 背光强度。按硬键盘或软键盘上的“PAGE UP”键或增加强度。 'PAGE DOWN' 降低强度。
为了让用户远离操作系统,我的 C++ 应用程序在主屏幕上有一个亮度 INC 和 DEC 按钮。这个想法是用户按下触摸屏上的按钮而不是调用 Windows 软键盘。
使用我在 stackoverflow 上找到的示例,我的 DEC 按钮处理程序代码如下所示。
INPUT input;
WORD vkey = VK_NEXT; //PAGE DOWN see Virtual-Key Codes in Winuser.h
input.type = INPUT_KEYBOARD;
input.ki.wScan = MapVirtualKey(vkey, MAPVK_VK_TO_VSC);
input.ki.time = 0;
input.ki.dwExtraInfo = 0;
input.ki.wVk = vkey;
input.ki.dwFlags = 0; // there is no KEYEVENTF_KEYDOWN
if( SendInput(1, &input, sizeof(INPUT)) == 0 )
// do GetLastError() here
input.ki.dwFlags = KEYEVENTF_KEYUP;
if( SendInput(1, &input, sizeof(INPUT)) == 0 )
// do GetLastError() here
代码编译并链接,但按下按钮时屏幕亮度不会改变。 SendInput 函数总是返回 1,从不返回 0。
我应该使用不同的功能吗?问题可能是因为我使用的是触摸屏吗?
【问题讨论】:
-
也许在两者之间添加一点延迟?
-
docs.microsoft.com/en-us/windows/win32/api/winuser/… "此功能受 UIPI 约束。应用程序只能将输入注入到具有相同或更低完整性级别的应用程序中。"如果你击中它,也不会感到惊讶。但不能肯定地说,因此是评论而不是答案。
-
与问题无关,但是(几乎总是)用
cInputs=1调用SendInput()是一个错误。除非您在按键之间执行睡眠,否则您应该将事件放入INPUT[2]数组中,然后在 1 次调用中将整个数组传递给SendInput()cInputs=2 -
补充@Frank所说的,同一页面还说:“此函数在被UIPI阻止时失败。请注意,GetLastError和返回值都不会指示失败是由引起的通过 UIPI 阻止。"
-
发送的输入转到具有焦点的窗口。所以可能是你的触摸屏覆盖而不是那个面板。您必须先调用 SetForegroundWindow(),这并不漂亮。向 IoT 供应商索取可用的 API。