在Windows 10周年纪念版中显示触摸键盘(TabTip.exe)
在Windows 8和Windows 10周年纪念更新之前,可以通过启动来显示触摸键盘
C:Program FilesCommon Filesmicrosoft sharedinkTabTip.exe 它不再适用于Windows 10周年纪念更新; TabTip.exe进程正在运行,但键盘未显示。 有没有办法以编程方式显示? UPDATE 我发现一个解决方法 – 假鼠标点击系统托盘中的触摸键盘图标。这里是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 我发现另一件事是,当启动TabTip.exe显示触摸键盘时,设置此注册表项可恢复旧功能 HKEY_LOCAL_MACHINESOFTWAREMicrosoftTabletTip1.7EnableDesktopModeAutoInvoke=1
好的,当用户按下系统托盘中的那个按钮时,我反向设计了什么浏览器。
基本上它创建一个未记录的接口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并重试。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 使用特定样本数据预览xaml布局
- windows – 在bat文件中包含bat文件
- winforms – 获取System.Windows.Forms.RichTextBox的标准上
- 禁用自动维护Windows Server 2016
- .net – 什么是User32.dll以及如何在WPF中使用它?
- 在Windows上,控制台窗口所有权如何工作?
- 在基于Windows的VPS中从Java访问Ubuntu服务器中托管的MS Ac
- 当中央存储库位于Windows文件共享上时,对多个用户使用git是
- windows-server-2008 – 为RDP创建锁定策略
- windows – x86 LargeAddressAware兼容性的单元测试