2011-10-18 16 views
9

Jaki byłby najlepszy sposób, aby aplikacja Windows .NET była jedynym programem, który może być używany na komputerze? Natknąłem się na liczniki czasu lub zdarzenia, aby przełączyć okna z powrotem na okno z pasującym tekstem i niektórymi wywołaniami api32, aby uzyskać najwyższy kształt formularza.Tworzenie aplikacji .NET jako jedynego programu, który można uruchomić?

Czy jest możliwe utworzenie aplikacji takiej jak ekran blokady systemu Windows, w której nie można nic zrobić poza tym, co jest na ekranie? Chcę blokować użytkownikom wykonywanie innych czynności i pozwalać administratorom tylko na dostęp do pulpitu.

+2

ja, jako użytkownik, by znaleźć taki komputer bezużyteczny :-) A komputera zdolnego do uruchamiania pojedynczej aplikacji. Byłbym znudzony :-) –

+3

@DarinDimitrov: Myślę, że jest to prawdopodobnie dla jakiegoś oprogramowania kasowego lub czegoś podobnego. Jak kiosk. –

+1

Masz na myśli coś podobnego do trybu [kiosku] (http://stackoverflow.com/questions/4617303/does-windows-7-have-a-kiosk-mode)? – R0MANARMY

Odpowiedz

1

Znalazłem o wiele prostszy sposób na to, nie używając trybu kiosku lub gpedi lub takie rzeczy.

W mojej aplikacji zrobiłem przycisk z tymi dwoma cholernymi prostymi rzeczami - bez pytań!

Użyłem powłoki shell.cmd, aby uruchomić aplikację typu "click", appref-ms, która działa jak urok.

'The logged in user has to be administrator or the app run as administrator once. 

My.Computer.Registry.SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IniFileMapping\system.ini\boot", "Shell", "USR:Software\Microsoft\Windows NT\CurrentVersion\Winlogon") 

'This will change the shell to your program for THIS LOGGED IN user- after re logon bye bye exploerer shell hello custom app!    

My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Winlogon", "Shell", appPath & "\shell.cmd")` 

Watch my software boot as if it owns windows!

Want to understand more how it works in the full apscect?

11

Musisz uruchomić aplikację w trybie kiosku.

metody zewnętrzne

[DllImport("user32.dll")] 
private static extern int FindWindow(string cls, string wndwText); 

[DllImport("user32.dll")] 
private static extern int ShowWindow(int hwnd, int cmd); 

[DllImport("user32.dll")] 
private static extern long SHAppBarMessage(long dword, int cmd); 

[DllImport("user32.dll")] 
private static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk); 

[DllImport("user32.dll")] 
private static extern int UnregisterHotKey(IntPtr hwnd, int id); 

Stałe

//constants for modifier keys 
private const int USE_ALT = 1; 
private const int USE_CTRL = 2; 
private const int USE_SHIFT = 4; 
private const int USE_WIN = 8; 

//hot key ID tracker 
short mHotKeyId = 0; 

Metody

private void RegisterGlobalHotKey(Keys hotkey, int modifiers) 
{ 
    try 
    { 
     // increment the hot key value - we are just identifying 
     // them with a sequential number since we have multiples 
     mHotKeyId++; 

     if (mHotKeyId > 0) 
     { 
      // register the hot key combination 
      if (RegisterHotKey(this.Handle, mHotKeyId, modifiers, Convert.ToInt16(hotkey)) == 0) 
      { 
       // tell the user which combination failed to register - 
       // this is useful to you, not an end user; the end user 
       // should never see this application run 
       MessageBox.Show("Error: " + mHotKeyId.ToString() + " - " + 
        Marshal.GetLastWin32Error().ToString(), 
        "Hot Key Registration"); 
      } 
     } 
    } 
    catch 
    { 
     // clean up if hotkey registration failed - 
     // nothing works if it fails 
     UnregisterGlobalHotKey(); 
    } 
} 


private void UnregisterGlobalHotKey() 
{ 
    // loop through each hotkey id and 
    // disable it 
    for (int i = 0; i < mHotKeyId; i++) 
    { 
     UnregisterHotKey(this.Handle, i); 
    } 
} 

protected override void WndProc(ref Message m) 
{ 
    base.WndProc(ref m); 

    // if the message matches, 
    // disregard it 
    const int WM_HOTKEY = 0x312; 
    if (m.Msg == WM_HOTKEY) 
    { 
     // Ignore the request or each 
     // disabled hotkey combination 
    } 
} 

Wyłącz klawisze funkcyjne

RegisterGlobalHotKey(Keys.F4, USE_ALT); 

// Disable CTRL+W - exit 
RegisterGlobalHotKey(Keys.W, USE_CTRL); 

// Disable CTRL+N - new window 
RegisterGlobalHotKey(Keys.N, USE_CTRL); 

// Disable CTRL+S - save 
RegisterGlobalHotKey(Keys.S, USE_CTRL); 

// Disable CTRL+A - select all 
RegisterGlobalHotKey(Keys.A, USE_CTRL); 

// Disable CTRL+C - copy 
RegisterGlobalHotKey(Keys.C, USE_CTRL); 

// Disable CTRL+X - cut 
RegisterGlobalHotKey(Keys.X, USE_CTRL); 

// Disable CTRL+V - paste 
RegisterGlobalHotKey(Keys.V, USE_CTRL); 

// Disable CTRL+B - organize favorites 
RegisterGlobalHotKey(Keys.B, USE_CTRL); 

// Disable CTRL+F - find 
RegisterGlobalHotKey(Keys.F, USE_CTRL); 

// Disable CTRL+H - view history 
RegisterGlobalHotKey(Keys.H, USE_CTRL); 

// Disable ALT+Tab - tab through open applications 
RegisterGlobalHotKey(Keys.Tab, USE_ALT); 

ukrywanie paska zadań

// hide the task bar - not a big deal, they can 
// still CTRL+ESC to get the start menu; for that 
// matter, CTRL+ALT+DEL also works; if you need to 
// disable that you will have to violate SAS and 
// monkey with the security policies on the machine 

ShowWindow(FindWindow("Shell_TrayWnd", null), 0); 

Przykład formy w trybie kiosku

using System; 
using System.Collections; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

public partial class frmKioskStarter : Form 
{     
    #region Dynamic Link Library Imports 

    [DllImport("user32.dll")] 
    private static extern int FindWindow(string cls, string wndwText); 

    [DllImport("user32.dll")] 
    private static extern int ShowWindow(int hwnd, int cmd); 

    [DllImport("user32.dll")] 
    private static extern long SHAppBarMessage(long dword, int cmd); 

    [DllImport("user32.dll")] 
    private static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk); 

    [DllImport("user32.dll")] 
    private static extern int UnregisterHotKey(IntPtr hwnd, int id); 

    #endregion 

    #region Modifier Constants and Variables 

    // Constants for modifier keys 
    private const int USE_ALT = 1; 
    private const int USE_CTRL = 2; 
    private const int USE_SHIFT = 4; 
    private const int USE_WIN = 8; 

    // Hot key ID tracker 
    short mHotKeyId = 0; 

    #endregion 

    public frmKioskStarter() 
    { 
     InitializeComponent(); 

     // Browser window key combinations 
     // -- Some things that you may want to disable -- 
     //CTRL+A   Select All 
     //CTRL+B   Organize Favorites 
     //CTRL+C   Copy 
     //CTRL+F   Find 
     //CTRL+H   View History 
     //CTRL+L   Open Locate 
     //CTRL+N   New window (not in Kiosk mode) 
     //CTRL+O   Open Locate 
     //CTRL+P   Print 
     //CTRL+R   Refresh 
     //CTRL+S   Save 
     //CTRL+V   Paste 
     //CTRL+W   Close 
     //CTRL+X   Cut 
     //ALT+F4   Close 

     // Use CTRL+ALT+DEL to open the task manager, 
     // kill IE and then close the application window 
     // to exit 

     // Disable ALT+F4 - exit 
     RegisterGlobalHotKey(Keys.F4, USE_ALT); 

     // Disable CTRL+W - exit 
     RegisterGlobalHotKey(Keys.W, USE_CTRL); 

     // Disable CTRL+N - new window 
     RegisterGlobalHotKey(Keys.N, USE_CTRL); 

     // Disable CTRL+S - save 
     RegisterGlobalHotKey(Keys.S, USE_CTRL); 

     // Disable CTRL+A - select all 
     RegisterGlobalHotKey(Keys.A, USE_CTRL); 

     // Disable CTRL+C - copy 
     RegisterGlobalHotKey(Keys.C, USE_CTRL); 

     // Disable CTRL+X - cut 
     RegisterGlobalHotKey(Keys.X, USE_CTRL); 

     // Disable CTRL+V - paste 
     RegisterGlobalHotKey(Keys.V, USE_CTRL); 

     // Disable CTRL+B - organize favorites 
     RegisterGlobalHotKey(Keys.B, USE_CTRL); 

     // Disable CTRL+F - find 
     RegisterGlobalHotKey(Keys.F, USE_CTRL); 

     // Disable CTRL+H - view history 
     RegisterGlobalHotKey(Keys.H, USE_CTRL); 

     // Disable ALT+Tab - tab through open applications 
     RegisterGlobalHotKey(Keys.Tab, USE_ALT); 

     // hide the task bar - not a big deal, they can 
     // still CTRL+ESC to get the start menu; for that 
     // matter, CTRL+ALT+DEL also works; if you need to 
     // disable that you will have to violate SAS and 
     // monkey with the security policies on the machine 
     ShowWindow(FindWindow("Shell_TrayWnd", null), 0); 
    } 

    /// <summary> 
    /// Launch the browser window in kiosk mode 
    /// using the URL keyed into the text box 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void button1_Click(object sender, EventArgs e) 
    { 
     System.Diagnostics.Process.Start("iexplore", "-k " + txtUrl.Text); 
    } 


    private void RegisterGlobalHotKey(Keys hotkey, int modifiers) 
    { 
     try 
     { 
      // increment the hot key value - we are just identifying 
      // them with a sequential number since we have multiples 
      mHotKeyId++; 

      if(mHotKeyId > 0) 
      { 
       // register the hot key combination 
       if (RegisterHotKey(this.Handle, mHotKeyId, modifiers, Convert.ToInt16(hotkey)) == 0) 
       { 
        // tell the user which combination failed to register - 
        // this is useful to you, not an end user; the end user 
        // should never see this application run 
        MessageBox.Show("Error: " + mHotKeyId.ToString() + " - " + 
         Marshal.GetLastWin32Error().ToString(), 
         "Hot Key Registration"); 
       } 
      } 
     } 
     catch 
     { 
      // clean up if hotkey registration failed - 
      // nothing works if it fails 
      UnregisterGlobalHotKey(); 
     } 
    } 


    private void UnregisterGlobalHotKey() 
    { 
     // loop through each hotkey id and 
     // disable it 
     for (int i = 0; i < mHotKeyId; i++) 
     { 
      UnregisterHotKey(this.Handle, i); 
     } 
    } 

    protected override void WndProc(ref Message m) 
    { 
     base.WndProc(ref m); 

     // if the message matches, 
     // disregard it 
     const int WM_HOTKEY = 0x312; 
     if (m.Msg == WM_HOTKEY) 
     { 
      // Ignore the request or each 
      // disabled hotkey combination 
     } 
    } 

    private void Form1_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     // unregister the hot keys 
     UnregisterGlobalHotKey(); 

     // show the taskbar - does not matter really 
     ShowWindow(FindWindow("Shell_TrayWnd", null), 1); 

    } 
} 

Oto artykuł można sprawdzić:
http://www.c-sharpcorner.com/UploadFile/scottlysle/KioskCS01292008011606AM/KioskCS.aspx

Oto niektóre pakowane oprogramowanie do zbadania:
http://www.kioware.com/productoverview.aspx?source=google&gclid=CPeQyrzz8qsCFZFV7Aod6noeMw

+0

Taka miła- Przypuszczam, że jest to najlepsza odpowiedź, ale zamierzam użyć linku podanego w komentarzach do pdf, jak zmienić program powłoki defautl-doing cały ten kod nie będzie konieczny i jeśli użytkownik chce na pulpicie uruchomić powłokę explorera z mojej aplikacji "powłoki" i wszystko jest w porządku. Dzięki za świetne odpowiedzi! – ppumkin

4

Jeśli zamiarem jest, aby zablokować to na stałe do określonego użytkownika, można zarządzać tym poprzez odpowiednie zasady grupowe.

Na przykład w edytorze zasad grupy lokalnej (menu startgpedit.msc), przejdź do Zasady komputera lokalnegoUser ConfigurationSzablony administracyjnesystemowe. Znajdziesz dwie opcje:

  • Nie uruchamiaj określonych aplikacji systemu Windows
  • uruchomić tylko określone aplikacje Windows

Oczywiście, trzeba zrobić wyśmienitą zarządzania polityką grupy ograniczyć inne rzeczy dla określonego użytkownika, uniemożliwiając zmianę konfiguracji, ponowne uruchomienie komputera itd.i musisz również zablokować specjalne klawisze aplikacji za pomocą haków klawiatury.

Pamiętaj: nie polegaj tylko na hakach, trybie pełnoekranowym i innych rzeczach uniemożliwiających użytkownikowi wyjście poza aplikację. Jeśli to zrobisz, pewnego dnia aplikacja ulegnie awarii, dając użytkownikowi nieograniczony dostęp do podstawowego systemu operacyjnego, systemu plików itp.