在Windows 10周年纪念版中显示触摸键盘(TabTip.exe)

在Windows 10周年纪念版中显示触摸键盘(TabTip.exe),第1张

概述在Windows 10周年纪念版中显示触摸键盘(TabTip.exe)

在周年更新之前的windows 8和windows 10中,可以通过启动来显示触摸键盘

C:Program filesCommon filesmicrosoft sharedinkTabTip.exe

它不再适用于windows 10周年更新; TabTip.exe进程正在运行,但键盘未显示。

有没有一种方法来显示它编程?

UPDATE

在windows 8模拟器中以触摸模式禁用“hover”

如何在非触摸式windows上testing支持触摸的应用程序?

确定windows 10 touch键盘是可见还是隐藏

在windows 8的WPF触摸桌面应用程序

如何知道tabletPC是在“笔记本电脑”或“平板电脑”模式

我发现一个解决方法 – 假的鼠标点击系统托盘中的触摸键盘图标。 这是delphi的代码

// Find tray icon window function FindTraybuttonWindow: THandle; var ShellTrayWnd: THandle; TrayNotifyWnd: THandle; begin Result := 0; ShellTrayWnd := FinDWindow('Shell_TrayWnd',nil); if ShellTrayWnd > 0 then begin TrayNotifyWnd := findwindowex(ShellTrayWnd,'TrayNotifyWnd',nil); if TrayNotifyWnd > 0 then begin Result := findwindowex(TrayNotifyWnd,'TIPBand',nil); end; end; end; // Post mouse click messages to it TraybuttonWindow := FindTraybuttonWindow; if TraybuttonWindow > 0 then begin PostMessage(TraybuttonWindow,WM_LbuttonDOWN,MK_Lbutton,$00010001); PostMessage(TraybuttonWindow,WM_LbuttonUP,$00010001); end;

更新2

我发现另一件事是设置此registry项恢复旧的function,当启动TabTip.exe显示触摸键盘

HKEY_LOCAL_MACHInesOFTWAREMicrosofttabletTip1.7EnableDesktopModeautoInvoke=1

Cordova config.xml中的windows 10图标

Xamlbutton在按下并保持在触摸屏上时被“点击”

在WinFormsinput焦点上自动popup平板电脑触摸键盘

什么是用于禁用手指input的windows API?

如何停止Explorer启动我的应用程序最大化?

好的,我反向设计了当用户按下系统托盘中的按钮时,浏览器执行的 *** 作。

基本上它创建了一个未ITipInvocation接口ITipInvocation的实例,并调用其Toggle(HWND)方法,将桌面窗口作为参数传递。 顾名思义,该方法根据当前状态显示或隐藏键盘。

请注意 ,资源管理器会在每次点击按钮时创建一个ITipInvocation实例。 所以我相信这个实例不应该被缓存。 我也注意到,资源管理器从不在所获得的实例上调用Release() 。 我不太熟悉COM,但是这看起来像一个BUG。

我在windows 8.1,windows 10和windows 10周年纪念版中进行了测试,效果非常好。 在C中,这是一个很小的例子,显然缺少一些错误检查。

#include <initguID.h> #include <Objbase.h> #pragma hdrstop // 4ce576fa-83dc-4F88-951c-9d0782b4e376 define_GUID(CLSID_UIHostNolaunch,0x4CE576FA,0x83DC,0x4f88,0x95,0x1C,0x9D,0x07,0x82,0xB4,0xE3,0x76); // 37c994e7_432b_4834_a2f7_dce1f13b834b define_GUID(IID_ITipInvocation,0x37c994e7,0x432b,0x4834,0xa2,0xf7,0xdc,0xe1,0xf1,0x3b,0x83,0x4b); struct ITipInvocation : IUnkNown { virtual HRESulT STDMETHODCALLTYPE Toggle(HWND wnd) = 0; }; int WinMain(HINSTANCE hInst,HINSTANCE hPrevInstance,LPSTR lpCmdline,int nCmdshow) { HRESulT hr; hr = CoInitialize(0); ITipInvocation* tip; hr = CoCreateInstance(CLSID_UIHostNolaunch,CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER,IID_ITipInvocation,(voID**)&tip); tip->Toggle(GetDesktopWindow()); tip->Release(); return 0; }

以下是C#版本:

class Program { static voID Main(string[] args) { var uiHostNolaunch = new UIHostNolaunch(); var tipInvocation = (ITipInvocation)uiHostNolaunch; tipInvocation.Toggle(GetDesktopWindow()); Marshal.ReleaseComObject(uiHostNolaunch); } [Comimport,GuID("4ce576fa-83dc-4F88-951c-9d0782b4e376")] class UIHostNolaunch { } [Comimport,GuID("37c994e7-432b-4834-a2f7-dce1f13b834b")] [InterfaceType(ComInterfaceType.InterfaceIsIUnkNown)] interface ITipInvocation { voID Toggle(IntPtr hwnd); } [Dllimport("user32.dll",SetLastError = false)] static extern IntPtr GetDesktopWindow(); }

更新:每@EugeneK评论,我相信tabtip.exe是有问题的COM组件的COM服务器,所以如果您的代码获取REGDB_E_CLASSNOTREG ,它应该可能运行tabtip.exe并再试一次。

我发现唯一的解决办法是发送PostMessage,就像你在回答1中提到的那样。这是C#版本,以防万一需要。

[Dllimport("user32.dll",CharSet = CharSet.Unicode)] private static extern IntPtr FinDWindow(string sClassname,string sAppname); [Dllimport("user32.dll",CharSet = CharSet.Unicode)] static extern IntPtr findwindowex(IntPtr parentHandle,IntPtr childAfter,string lclassname,string windowTitle); [Dllimport("User32.Dll",EntryPoint = "PostMessageA")] static extern bool PostMessage(IntPtr hWnd,uint msg,int wParam,int lParam); var trayWnd = FinDWindow("Shell_TrayWnd",null); var nullintPtr = new IntPtr(0); if (trayWnd != nullintPtr) { var trayNotifyWnd = findwindowex(trayWnd,nullintPtr,"TrayNotifyWnd",null); if (trayNotifyWnd != nullintPtr) { var tIPBanDWnd = findwindowex(trayNotifyWnd,"TIPBand",null); if (tIPBanDWnd != nullintPtr) { PostMessage(tIPBanDWnd,(UInt32)WMessages.WM_LbuttonDOWN,1,65537); PostMessage(tIPBanDWnd,(UInt32)WMessages.WM_LbuttonUP,65537); } } } public enum WMessages : int { WM_LbuttonDOWN = 0x201,WM_LbuttonUP = 0x202,WM_KEYDOWN = 0x100,WM_KEYUP = 0x101,WH_KEYBOARD_LL = 13,WH_MOUSE_LL = 14,}

当在windows 10周年更新中尝试打开触摸键盘时,检测到4种情况

键盘是可见的 – 当“IPTIP_Main_Window”存在时,不禁用和可见

键盘不可见 – 当“IPTIP_Main_Window”存在但禁用时

键盘不可见 – 当“IPTIP_Main_Window”存在但未禁用且不可见时

键盘不可见 – 当“IPTIP_Main_Window” 不存在时

1 – 无事可做

2 + 3 – 通过COM激活

4 – 最有趣的场景。 在一些设备启动TabTip过程打开触摸键盘,在一些 – 不。 因此,我们必须启动TabTip进程,等待出现窗口“IPTIP_Main_Window”,检查它的可见性,如果有必要,通过COM激活它。

我为我的项目制作小型图书馆,你可以使用它 – osklib

这个问题似乎是与windows *** 作系统的设置。 我遇到了与我正在开发的应用程序相同的问题。 随着windows 8和10(更新之前)称为键盘的代码工作正常,但更新后失败的工作。 看完这篇文章后 ,我做了以下工作:

按下Win + I打开设置应用程序

点击Devices> TyPing

打开“ 没有键盘连接到设备时,在窗口应用程序中自动显示触摸键盘 ”。

在那之后,键盘开始出现在windows 10中。

关于windows 10周年更新如何设置触摸键盘,还有一些疑问。 我实际上有完全相同的问题,这里是我找到的最新信息:

windows 10 1607有两种模式:桌面和平板电脑。 在桌面模式下,可以调用TabTip.exe,但不会显示。 在平板电脑模式下,一切工作正常:TabTip.exe时显示自己被调用。 因此,100%的解决方法是将您的电脑设置为平板电脑模式,但是希望他的台式机/笔记本电脑在平板电脑模式下工作? 不是我!

您可以使用“ EnableDesktopModeautoInvoke ”键(HKCU,DWORD设置为1),在运行1607的某些计算机上,在桌面模式下工作良好。 但由于某些未知的原因,这不适用于我的惠普触摸板。

请注意,此注册表值是“windows参数”>“touch”中的“如果没有连接键盘,则在桌面模式下显示触摸键盘”选项

你可以使用Torvin的代码来显示TabTip.exe(如提到的TabTip.exe应该在你做COM的时候运行),它在运行1607的某些计算机上工作正常(包括我的惠普触摸板!耶!)但它什么也不做在一些其他与相同的windows Build版本。

到目前为止在4个不同的电脑上测试,我无法得到的东西工作正常…

在您的控件中实现IValueProvIDer / ITextProvIDer是实现此目的的正确方法,如下所述: https ://stackoverflow.com/a/43886052/1184950

总结

以上是内存溢出为你收集整理的在Windows 10周年纪念版中显示触摸键盘(TabTip.exe)全部内容,希望文章能够帮你解决在Windows 10周年纪念版中显示触摸键盘(TabTip.exe)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1235389.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存