Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式控制Windows 7屏幕键盘_C#_.net_Winforms_On Screen Keyboard - Fatal编程技术网

C# 以编程方式控制Windows 7屏幕键盘

C# 以编程方式控制Windows 7屏幕键盘,c#,.net,winforms,on-screen-keyboard,C#,.net,Winforms,On Screen Keyboard,我有一个在Windows7平板电脑上运行的应用程序,需要将屏幕键盘固定在屏幕底部。理想情况下,我想阻止某人移动或更改这些设置 使用这里堆栈溢出答案的注释,我可以通过编程将键盘固定到屏幕底部,这就是一个开始。我必须获得更高的许可才能让它工作 [DllImport("user32.dll", SetLastError = true)] static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [return:

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

使用这里堆栈溢出答案的注释,我可以通过编程将键盘固定到屏幕底部,这就是一个开始。我必须获得更高的许可才能让它工作

[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) 似乎很简单:

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

我对解决方案有不同的想法:
a) 创建一个线程,定期检查键盘窗口是否已调整大小/最小化/移动,并使用(例如)SetWindowPos重置其位置

b) “侦听”调整大小/最小化/移动事件(WH_CBT=发生在这些事件之前)并结束它。遗憾的是,我不知道是否以及如何强制禁用通过WHU CBT宣布的事件。
似乎还有另一种解决方案:

向下滚动到评论部分,找到用户Pavel Shkleinik写的内容。
事件系统移动大小*和事件系统最小化*对您的案例来说似乎很有趣。
您可以检测before事件并停止它们(如果我只知道如何停止的话),或者检测这些事件的结束并强制重置窗口位置(SetWindowPos)。
Pinvoke Wiki和Google将帮助您设置挂钩:

相关:只是想确定一下:你说的是不能调整大小的黑色“新式”键盘,还是有“普通”窗口边框且可以调整大小的旧屏幕键盘?@Traubenfuchs我说的是新式键盘。但我也看过旧的osk.exe,我也无法说服它移动。不知道这是否与在Windows7x64上尝试这样做有关。但这可能需要更多的调查。