使用窗口句柄使用P / Invoke禁用鼠标单击和键盘输入

时间:2010-05-21 05:44:54

标签: c# .net pinvoke

我需要为Kiosk应用程序的特定窗口禁用鼠标单击,鼠标移动和键盘输入。使用.NET是否可行?

我已删除特定窗口的菜单栏和标题栏,这是否是达到上述要求的起点?

使用窗口句柄删除菜单栏和标题栏的代码:

#region Constants
//Finds a window by class name
[DllImport("USER32.DLL")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

//Sets a window to be a child window of another window
[DllImport("USER32.DLL")]
public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

//Sets window attributes
[DllImport("USER32.DLL")]
public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

//Gets window attributes
[DllImport("USER32.DLL")]
public static extern int GetWindowLong(IntPtr hWnd, int nIndex);

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

[DllImport("user32.dll")]
static extern IntPtr GetMenu(IntPtr hWnd);

[DllImport("user32.dll")]
static extern int GetMenuItemCount(IntPtr hMenu);

[DllImport("user32.dll")]
static extern bool DrawMenuBar(IntPtr hWnd);

[DllImport("user32.dll")]
static extern bool RemoveMenu(IntPtr hMenu, uint uPosition, uint uFlags);

//assorted constants needed
public static uint MF_BYPOSITION = 0x400;
public static uint MF_REMOVE = 0x1000;
public static int GWL_STYLE = -16;
public static int WS_CHILD = 0x40000000; //child window
public static int WS_BORDER = 0x00800000; //window with border
public static int WS_DLGFRAME = 0x00400000; //window with double border but no title
public static int WS_CAPTION = WS_BORDER | WS_DLGFRAME; //window with a title bar 
public static int WS_SYSMENU = 0x00080000; //window menu  
#endregion

public static void WindowsReStyle()
{ 
    Process[] Procs = Process.GetProcesses();
    foreach (Process proc in Procs)
    {
        if (proc.ProcessName.StartsWith("notepad"))
        {
            IntPtr pFoundWindow = proc.MainWindowHandle;
            int style = GetWindowLong(pFoundWindow, GWL_STYLE);

            //get menu
            IntPtr HMENU = GetMenu(proc.MainWindowHandle);
            //get item count
            int count = GetMenuItemCount(HMENU);
            //loop & remove
            for (int i = 0; i < count; i++)
                RemoveMenu(HMENU, 0, (MF_BYPOSITION | MF_REMOVE));

            //force a redraw
            DrawMenuBar(proc.MainWindowHandle);
            SetWindowLong(pFoundWindow, GWL_STYLE, (style & ~WS_SYSMENU)); 
            SetWindowLong(pFoundWindow, GWL_STYLE, (style & ~WS_CAPTION)); 
        } 
    }
}

1 个答案:

答案 0 :(得分:1)

使用EnableWindow API来执行此操作。我多年没有用过这个,但我不相信这有任何交叉过程问题。