如何在自定义位置打开 tabtip 键盘?
How to open tabtip keyboard in a custom location?
如何在自定义位置打开 tabtip 键盘?
这是我的代码:
Private tabtipProcess As Process
Private Sub t_Enter(sender As Object, e As EventArgs)
tabtipProcess = Process.Start("tabtip")
End Sub
[如果 OP 决定改用第三方应用程序,则提供解决方案的未删除答案]
- 郑重声明,您似乎无法以编程方式更改 tabtip 的位置。
你可以P/Invoke(也称为Platform Invoke) the WinAPI's SetWindowPos()
function and send your process's MainWindowHandle
。然后你只需指定要放置window的坐标即可。
<DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As Integer) As Boolean
End Function
Const SWP_NOSIZE As Integer = &H0001
Private tabtipProcess As Process
Private Sub t_Enter(sender As Object, e As EventArgs)
tabtipProcess = Process.Start("tabtip")
tabtipProcess.WaitForInputIdle()
SetWindowPos(tabtipProcess.MainWindowHandle, IntPtr.Zero, 300, 200, 0, 0, SWP_NOSIZE)
End Sub
上面的例子会将window放在坐标(300, 200)处。
tabtipProcess.WaitForInputIdle()
调用是必需的,因为它用于等待应用程序完成加载并创建 window 句柄。没有它 tabtipProcess.MainWindowHandle
很可能会 return 0
并在调用 SetWindowPos()
函数时导致错误。
传递 SWP_NOSIZE
标志告诉函数 window 应保留其当前大小。
在最终测试我之前的答案后,我可以确认(如您所说)它不起作用,所以我做了一些研究。
还有一些其他人也想改变它的位置,所以在阅读了一些帖子和我自己进行了一些测试之后,tabtip
应用程序似乎被设计成陷阱某些window 条消息(更具体地说 WM_MOVE and/or WM_WINDOWPOSCHANGING and WM_WINDOWPOSCHANGED),使您无法使用标准方法以编程方式更改其位置或大小。
目前似乎没有办法修改它的位置。
您可以通过更改选项卡提示的注册表值来完成此操作。
像这样:
My.Computer.Registry.SetValue(
"HKEY_CURRENT_USER\SOFTWARE\Microsoft\TabletTip.7",
"OptimizedKeyboardRelativeXPositionOnScreen",
&HDB1D,
Microsoft.Win32.RegistryValueKind.DWord
)
My.Computer.Registry.SetValue(
"HKEY_CURRENT_USER\SOFTWARE\Microsoft\TabletTip.7",
"OptimizedKeyboardRelativeYPositionOnScreen",
&H12016,
Microsoft.Win32.RegistryValueKind.DWord
)
这两个十六进制值是您的 x 和 y 的位置。
杰夫
如何在自定义位置打开 tabtip 键盘?
这是我的代码:
Private tabtipProcess As Process
Private Sub t_Enter(sender As Object, e As EventArgs)
tabtipProcess = Process.Start("tabtip")
End Sub
[如果 OP 决定改用第三方应用程序,则提供解决方案的未删除答案]
- 郑重声明,您似乎无法以编程方式更改 tabtip 的位置。
你可以P/Invoke(也称为Platform Invoke) the WinAPI's SetWindowPos()
function and send your process's MainWindowHandle
。然后你只需指定要放置window的坐标即可。
<DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As Integer) As Boolean
End Function
Const SWP_NOSIZE As Integer = &H0001
Private tabtipProcess As Process
Private Sub t_Enter(sender As Object, e As EventArgs)
tabtipProcess = Process.Start("tabtip")
tabtipProcess.WaitForInputIdle()
SetWindowPos(tabtipProcess.MainWindowHandle, IntPtr.Zero, 300, 200, 0, 0, SWP_NOSIZE)
End Sub
上面的例子会将window放在坐标(300, 200)处。
tabtipProcess.WaitForInputIdle()
调用是必需的,因为它用于等待应用程序完成加载并创建 window 句柄。没有它 tabtipProcess.MainWindowHandle
很可能会 return 0
并在调用 SetWindowPos()
函数时导致错误。
传递 SWP_NOSIZE
标志告诉函数 window 应保留其当前大小。
在最终测试我之前的答案后,我可以确认(如您所说)它不起作用,所以我做了一些研究。
还有一些其他人也想改变它的位置,所以在阅读了一些帖子和我自己进行了一些测试之后,tabtip
应用程序似乎被设计成陷阱某些window 条消息(更具体地说 WM_MOVE and/or WM_WINDOWPOSCHANGING and WM_WINDOWPOSCHANGED),使您无法使用标准方法以编程方式更改其位置或大小。
目前似乎没有办法修改它的位置。
您可以通过更改选项卡提示的注册表值来完成此操作。
像这样:
My.Computer.Registry.SetValue(
"HKEY_CURRENT_USER\SOFTWARE\Microsoft\TabletTip.7",
"OptimizedKeyboardRelativeXPositionOnScreen",
&HDB1D,
Microsoft.Win32.RegistryValueKind.DWord
)
My.Computer.Registry.SetValue(
"HKEY_CURRENT_USER\SOFTWARE\Microsoft\TabletTip.7",
"OptimizedKeyboardRelativeYPositionOnScreen",
&H12016,
Microsoft.Win32.RegistryValueKind.DWord
)
这两个十六进制值是您的 x 和 y 的位置。
杰夫