【问题标题】:Programmatically control Windows 7 on screen keyboard以编程方式在屏幕键盘上控制 Windows 7
【发布时间】:2014-01-27 17:46:03
【问题描述】:

我有一个要在 Windows 7 平板电脑上运行的应用程序,并且需要将屏幕键盘停靠在屏幕底部。理想情况下,我想阻止某人移动或更改这些设置。

使用此处How do I control the text input panel programmatically (TabTip.exe) in Windows Vista/7 上发布到堆栈溢出答案的评论,我能够以编程方式将键盘停靠在屏幕底部,这是一个开始。我必须以提升的权限运行才能让它工作

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

string onScreenKeyboardPath = @"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe";
var onScreenKeyboardProc = Process.Start(onScreenKeyboardPath);

IntPtr wKB = FindWindow("IPTip_Main_Window", null);

const uint WM_COMMAND = 0x111;
// Where message is 10021 for dock bottom, 10023 for dock top and 10020 for floating
bool x = PostMessage(wKB, WM_COMMAND, new IntPtr(10021), IntPtr.Zero);

我希望能够更好地控制大小,所以我尝试像这样移动窗口:

[DllImport("user32.dll")]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

private const uint SWP_SHOWWINDOW = 0x0040;
bool ok = SetWindowPos(wKB, this.Handle, 0, 500, 750, 500, SWP_SHOWWINDOW);

ok 返回 true,但窗口不移动。如果我尝试使用记事本执行此操作,它会完美运行。那么这个特定程序有问题吗?

【问题讨论】:

  • 只是为了确定:您是在谈论无法调整大小的黑色“新式”键盘还是具有“正常”窗口边框且可以调整大小的旧屏幕键盘?跨度>
  • @Traubenfuchs 我说的是新型键盘。但我也查看了旧的 osk.exe,我也无法说服那个移动。想知道这是否与尝试在 Windows 7 x64 上执行此操作有关。但也许这需要更多调查。

标签: c# .net winforms on-screen-keyboard


【解决方案1】:

您的问题可以分为以下几个部分

1) 防止窗口被移动
2) 防止窗口被调整大小
3) 防止窗口最小化

1) 似乎很简单:How do you prevent a windows from being moved?

2) & 3) 可以在同一步骤中解决。

我对解决方案有不同的想法:
a) 创建一个线程,定期检查键盘窗口是否已调整大小/最小化/移动并使用(例如)SetWindowPos
How to get and set the window position of another application in C#
重置其位置 b)“监听”调整大小/最小化/移动事件(WH_CBT = 发生在任何这些事件之前)并结束它。遗憾的是,我不知道是否以及如何强制禁用通过 WH_CBT 宣布的事件。
好像还有别的解决办法:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx
向下滚动到 cmets 部分,查看用户 Pavel Shkleinik 所写的内容。
EVENT_SYSTEM_MOVESIZ* 和 EVENT_SYSTEM_MINIMIZE* 似乎对您的情况很有趣。
您可以检测之前的事件并停止它们(如果我只知道如何)或检测这些事件的结束并强制重置窗口位置 (SetWindowPos)。
Pinvoke Wiki 和 Google 将帮助您设置挂钩:
http://www.pinvoke.net/default.aspx/user32.setwineventhook

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多