我希望这样做,以便当我的程序的用户执行某项操作(例如单击程序的WinForm中的按钮)时,Windows屏幕键盘(osk.exe)将启动,但是需要注意的是,我希望屏幕键盘能够通过禁用或删除的标题栏启动 - 例如,禁用“最小化”按钮和“退出/关闭”按钮。
我的问题是,是否有人知道这样做的安全方法。
我的理由是这样的:我希望Windows屏幕键盘在程序的某些部分自动出现,但我们都知道墨菲定律:任何可能出错的东西都会出错。 我不希望用户能够通过键入中途的GUI轻松退出OSK。底层程序本身将知道何时关闭/隐藏osk。
我尝试过搜索类似问题的问题,而我发现的最好的是following,问题没有得到真正解答,但其中一条评论说
如果您想避免访问被拒绝错误,则需要提升您的流程。
我知道如何通过之前的C#SO问题禁用GUI的Maximize / Exit / TitleBar / TitleMenu部分(谢谢!)。但问题是当启动过程为“auto-elevated”时。普通用户无法在没有“升级”的情况下编辑GUI。海拔似乎是一个全有或全无的交易;你是管理员,或者你不是。 如果最终用户必须以管理员身份运行,则安全性很差!
所以我恳请一些安全的解决方案:某些方法可以让非管理员用户能够看到并使用没有启用“退出”或“最小化”按钮的屏幕键盘。也许有一种方法可以强制另一个用户(最终用户无权访问)来启动和修改OSK,这样最终用户本身就不必具有特权。或者一种升级最终用户的方法,只是为了获得这一特定进程的许可。 这样的特权真的是全有或全无吗?
其他信息:以下是一些人员链接,解释了如何禁用Windows进程的GUI的某些部分。
Run an independent application inside a winforms application。 例如,以下是如何摆脱记事本进程的边框并嵌入到窗体中: [的DllImport( “USER32.DLL”)] static extern IntPtr SetParent(IntPtr hWndChild,IntPtr hWndNewParent);
[DllImport("user32.dll")]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll", SetLastError = true)]
private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);
private const int GWL_STYLE = (-16);
private const int WS_VISIBLE = 0x10000000;
private const int WS_MAXIMIZE = 0x01000000;
private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
private const UInt32 SWP_NOSIZE = 0x0001;
private const UInt32 SWP_NOMOVE = 0x0002;
private const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
public Form1()
{
InitializeComponent();
Process p = System.Diagnostics.Process.Start("notepad");
p.WaitForInputIdle();
if (p.MainWindowHandle == null)
{
MessageBox.Show(this, "hello", "Error");
}
SetParent(p.MainWindowHandle, this.Handle);
SetWindowLong(p.MainWindowHandle, GWL_STYLE, WS_VISIBLE);
MoveWindow(p.MainWindowHandle, 0, 0, this.Width, this.Height, true);
}
这适用于不需要提升的程序。但是,屏幕键盘或MMC管理单元等程序在尝试在窗口上使用P / Invoke函数(例如SetWindowPos)时会给非管理用户提供Access Denied(5)错误。