我有一个应用程序,就像一个屏幕上的键盘,我需要它知道,如果有一个键盘光标(插入符号)活动的任何地方,所以键盘将设置为活动。我已经搜索了键盘挂钩和winapi,但我找不到合适的方法来使用。为了简化我的问题,我需要我的应用程序处于活动状态,如果用户可以按下真实的键盘并在计算机上打印文本。
6xfqseft1#
这是一个解决办法,但是如果你可以在你的环境中订阅一个OnFocusChange事件,那么你就可以检查新接收到焦点的控件的类型。根据它是一个“keyboardable”类型(或者是从“keyboardable”类型派生的),你可以显示或隐藏你的键盘。
pb3s4cty2#
定义一个DLLImport,这样你就可以得到当前聚焦的窗口句柄:
DLLImport
[DllImport("user32.dll")]static extern IntPtr GetFocus();
[DllImport("user32.dll")]
static extern IntPtr GetFocus();
字符串现在,你可以运行这个来获取窗口句柄,如果有一些东西被键盘聚焦的话:
public static bool ControlIsFocused() { // To get hold of the focused control: IntPtr focusedHandle = GetFocus(); return focusedHandle != IntPtr.Zero;}
public static bool ControlIsFocused()
{
// To get hold of the focused control:
IntPtr focusedHandle = GetFocus();
return focusedHandle != IntPtr.Zero;
}
型所以,除非它是一个允许键盘焦点的控件,否则这个方法应该返回IntPtr.Zero。这里是Windows API的链接。
IntPtr.Zero
ergxz8rk3#
为什么不直接使用GetCaretPos函数?它说:插入符号的位置总是在包含插入符号的窗口的客户端坐标中给出。如果函数成功,返回值为非零。如果函数失败,返回值为零。要获取扩展的错误信息,请调用GetLastError。
g6ll5ycj4#
这是很容易通过搜索插入符号的位置,因为它应该大于0
GUITHREADINFO lpgui = new GUITHREADINFO(); IntPtr fore = GetForegroundWindow(); uint tpid = GetWindowThreadProcessId(fore, IntPtr.Zero); lpgui.cbSize = Marshal.SizeOf(lpgui.GetType()); bool flag = GetGUIThreadInfo(tpid, out lpgui); WINDOWINFO pwi = new WINDOWINFO(); pwi.cbSize = (uint)Marshal.SizeOf(pwi.GetType()); GetWindowInfo((IntPtr)lpgui.hwndCaret, ref pwi); if (flag) { if (!(lpgui.rcCaret.Location.X == 0 && lpgui.rcCaret.Location.Y == 0)) { //TODO } }
GUITHREADINFO lpgui = new GUITHREADINFO();
IntPtr fore = GetForegroundWindow();
uint tpid = GetWindowThreadProcessId(fore, IntPtr.Zero);
lpgui.cbSize = Marshal.SizeOf(lpgui.GetType());
bool flag = GetGUIThreadInfo(tpid, out lpgui);
WINDOWINFO pwi = new WINDOWINFO();
pwi.cbSize = (uint)Marshal.SizeOf(pwi.GetType());
GetWindowInfo((IntPtr)lpgui.hwndCaret, ref pwi);
if (flag)
if (!(lpgui.rcCaret.Location.X == 0 && lpgui.rcCaret.Location.Y == 0))
//TODO
字符串
4条答案
按热度按时间6xfqseft1#
这是一个解决办法,但是如果你可以在你的环境中订阅一个OnFocusChange事件,那么你就可以检查新接收到焦点的控件的类型。根据它是一个“keyboardable”类型(或者是从“keyboardable”类型派生的),你可以显示或隐藏你的键盘。
pb3s4cty2#
定义一个
DLLImport
,这样你就可以得到当前聚焦的窗口句柄:字符串
现在,你可以运行这个来获取窗口句柄,如果有一些东西被键盘聚焦的话:
型
所以,除非它是一个允许键盘焦点的控件,否则这个方法应该返回
IntPtr.Zero
。这里是Windows API的链接。
ergxz8rk3#
为什么不直接使用GetCaretPos函数?
它说:
插入符号的位置总是在包含插入符号的窗口的客户端坐标中给出。
如果函数成功,返回值为非零。如果函数失败,返回值为零。要获取扩展的错误信息,请调用GetLastError。
g6ll5ycj4#
这是很容易通过搜索插入符号的位置,因为它应该大于0
字符串