Единственный надежный способ - подключиться к очереди событий Windows и закрыть диалоговые окна (так как пользователь может получить доступ ко многим вещам). Вот что делает наш вспомогательный класс:
void ListenForDialogCreation()
{
// Listen for name change changes across all processes/threads on current desktop...
_WinEventHook = WinAPI.SetWinEventHook(WinAPI.EVENT_OBJECT_CREATE, procDelegate);
}
void StopListeningForDialogCreation()
{
WinAPI.UnhookWinEvent(_WinEventHook);
}
void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
{
const uint OBJID_WINDOW = 0;
const uint CHILDID_SELF = 0;
// filter out non-HWND, and things not children of the current application
if (idObject != OBJID_WINDOW || idChild != CHILDID_SELF)
return;
//Get the window class name
StringBuilder ClassName = new StringBuilder(100);
WinAPI.GetClassName(hwnd, ClassName, ClassName.Capacity);
// Send close message to any dialog
if (ClassName.ToString() == "#32770")
{
WinAPI.SendMessage(hwnd, WinAPI.WM.CLOSE, IntPtr.Zero, IntPtr.Zero);
if (OnDialogCancelled != null)
OnDialogCancelled();
}
if (ClassName.ToString() == "#32768")
{
WinAPI.SendMessage(hwnd, WinAPI.WM.CLOSE, IntPtr.Zero, IntPtr.Zero);
if (OnDialogCancelled != null)
OnDialogCancelled();
}
}
public delegate void OnDialogCancelledEvent();
public event OnDialogCancelledEvent OnDialogCancelled;
- # 32770 - класс диалога
- # 32768 - всплывающее меню
- пространство имен WinAPI - это наша оболочка для pinvoke.
Если вы не хотите блокировать все диалоги, вам нужно добавить некоторые дополнительные фильтры, как только вы поймете класс. Это зависит от того, насколько вы должны быть в безопасности. В $ WORK нам нужно было заблокировать все загрузки и выгрузки.
Необходимо отключить всплывающее меню, поскольку оно дает доступ к приложению справки, которое дает ссылки на веб-сайт Microsoft, что позволяет запускать полный экземпляр IE. Тогда они могут делать все, что хотят.