我有一个要在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,但窗口不退缩。如果我尝试使用记事本执行此操作,则效果很好。那么这个特定程序有问题吗?
最佳答案
您的问题可以分为以下几个部分
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
向下滚动到评论部分,找到用户Pavel Shkleinik编写的内容。
EVENT_SYSTEM_MOVESIZ *和EVENT_SYSTEM_MINIMIZE *对于您的情况似乎很有趣。
您可以检测到before事件并停止它们(如果我只知道如何),或者检测到这些事件的结束并强制重置窗口位置(SetWindowPos)。
Pinvoke Wiki和Google会帮助您设置挂钩:
http://www.pinvoke.net/default.aspx/user32.setwineventhook