2010-05-21 2 views
1

Мне нужно отключить мышь, перемещение мыши и входы клавиатуры для определенных окон для приложения киоска. Можно ли использовать .NET?Использование Window Handle для отключения щелчков мыши и ввода с клавиатуры с использованием P/Invoke

Я удалил панель меню и строку заголовка определенного окна, это будет отправной точкой для достижения вышеуказанного требования?

Код для удаления строки меню и строка заголовка с помощью оконной ручки:

#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)); 
     } 
    } 
} 
+0

Как пользователь может взаимодействовать с приложением без клавиатуры или мыши? –

+0

@ Carlos Loth, пользователю не нужно взаимодействовать. Это приложение предназначено только для просмотра. Хотя у него есть некоторые вещи, связанные с мышью и набором текста, мне нужно отключить мышь и клавиатуру этого окна. – Anuya

+0

Если можно удалить строку заголовка и строку меню внешнего приложения, я думаю, что даже отключая мышь можно. Да? – Anuya

ответ

1

Используйте EnableWindow API вызова, чтобы сделать это. Я не использовал это в течение многих лет, но я не думаю, что с этим связаны какие-то проблемы с перекрестными процессами.

Смежные вопросы