.net 如何知道键盘在文本输入时是否处于活动状态

u2nhd7ah  于 2023-11-20  发布在  .NET
关注(0)|答案(4)|浏览(172)

我有一个应用程序,就像一个屏幕上的键盘,我需要它知道,如果有一个键盘光标(插入符号)活动的任何地方,所以键盘将设置为活动。
我已经搜索了键盘挂钩和winapi,但我找不到合适的方法来使用。
为了简化我的问题,我需要我的应用程序处于活动状态,如果用户可以按下真实的键盘并在计算机上打印文本。

6xfqseft

6xfqseft1#

这是一个解决办法,但是如果你可以在你的环境中订阅一个OnFocusChange事件,那么你就可以检查新接收到焦点的控件的类型。根据它是一个“keyboardable”类型(或者是从“keyboardable”类型派生的),你可以显示或隐藏你的键盘。

pb3s4cty

pb3s4cty2#

定义一个DLLImport,这样你就可以得到当前聚焦的窗口句柄:

  1. [DllImport("user32.dll")]
  2. static extern IntPtr GetFocus();

字符串
现在,你可以运行这个来获取窗口句柄,如果有一些东西被键盘聚焦的话:

  1. public static bool ControlIsFocused()
  2. {
  3. // To get hold of the focused control:
  4. IntPtr focusedHandle = GetFocus();
  5. return focusedHandle != IntPtr.Zero;
  6. }


所以,除非它是一个允许键盘焦点的控件,否则这个方法应该返回IntPtr.Zero
这里是Windows API的链接。

展开查看全部
ergxz8rk

ergxz8rk3#

为什么不直接使用GetCaretPos函数?
它说:
插入符号的位置总是在包含插入符号的窗口的客户端坐标中给出。
如果函数成功,返回值为非零。如果函数失败,返回值为零。要获取扩展的错误信息,请调用GetLastError。

g6ll5ycj

g6ll5ycj4#

这是很容易通过搜索插入符号的位置,因为它应该大于0

  1. GUITHREADINFO lpgui = new GUITHREADINFO();
  2. IntPtr fore = GetForegroundWindow();
  3. uint tpid = GetWindowThreadProcessId(fore, IntPtr.Zero);
  4. lpgui.cbSize = Marshal.SizeOf(lpgui.GetType());
  5. bool flag = GetGUIThreadInfo(tpid, out lpgui);
  6. WINDOWINFO pwi = new WINDOWINFO();
  7. pwi.cbSize = (uint)Marshal.SizeOf(pwi.GetType());
  8. GetWindowInfo((IntPtr)lpgui.hwndCaret, ref pwi);
  9. if (flag)
  10. {
  11. if (!(lpgui.rcCaret.Location.X == 0 && lpgui.rcCaret.Location.Y == 0))
  12. {
  13. //TODO
  14. }
  15. }

字符串

展开查看全部

相关问题