2011-10-18 18 views
9

Quale sarebbe il modo migliore per rendere un'applicazione Windows .NET l'unico programma che può essere utilizzato su un computer? Mi sono imbattuto in timer o eventi per riportare Windows a una finestra con testo corrispondente e alcune chiamate api32 per rendere più alto un modulo.Fare un'applicazione .NET l'unico programma che può essere eseguito?

È possibile creare un'applicazione come la schermata di blocco di Windows in cui nulla può essere fatto tranne che cosa è visualizzato sullo schermo? Voglio impedire agli utenti di fare altre cose e lasciare che gli amministratori arrivino sul desktop.

+2

Io, come utente, potrebbe trovare ad esempio di computer abbastanza inutile :-) Un computer in grado di eseguire una singola applicazione. Mi annoierei :-) –

+3

@DarinDimitrov: Penso che questo sia probabilmente per qualche tipo di software per registratore di cassa o qualcosa del genere. Come un chiosco. –

+1

Intendi qualcosa sulla falsariga di una [modalità kiosk] (http://stackoverflow.com/questions/4617303/does-windows-7-have-a-kiosk-mode)? – R0MANARMY

risposta

1

Ho trovato un modo molto più semplice per farlo senza usare la modalità kiosk o gpedits o qualsiasi cosa del genere.

Nella mia applicazione ho creato un pulsante con queste due semplici e semplici cose: nessuna domanda!

Ho usato shell.cmd per avviare un clic una volta l'applicazione, appref-ms e ha un fascino.

'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

È necessario eseguire l'applicazione in modalità kiosk.

metodi esterni

[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); 

Costanti

//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; 

Metodi

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 
    } 
} 

Disable tasti

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); 

mostrare la barra

// 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); 

forma Esempio in modalità continua

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); 

    } 
} 

Ecco un articolo è possibile controllare:
http://www.c-sharpcorner.com/UploadFile/scottlysle/KioskCS01292008011606AM/KioskCS.aspx

Ecco alcuni software pacchettizzato per esaminare:
http://www.kioware.com/productoverview.aspx?source=google&gclid=CPeQyrzz8qsCFZFV7Aod6noeMw

+0

Sì, bella- suppongo che questa sia la migliore risposta, ma in realtà userò il link fornito nei commenti in un pdf su come cambiare il programma della shell defautl tutto quel codice non sarà necessario e se l'utente vuole il desktop, eseguo la shell di Explorer dalla mia applicazione "shell" e tutto va bene. Grazie per le grandi risposte! – ppumkin

4

Se il vostro intento è quello di bloccare questa in modo permanente per un utente specifico, è possibile gestire questo attraverso politiche di gruppo appropriate.

Per esempio in Criteri di gruppo locali Editor (menu di avvio gpedit.msc), vai a Criteri del computer localeConfigurazione utenteModelli amministrativisistema. Troverete due opzioni:

  • Non eseguire le applicazioni Windows specificate
  • eseguire le applicazioni solo per Windows specificate

Naturalmente, quello che dovete fare ammenda di gestione dei criteri di gruppo per limitare le altre cose per un utente specificato, impedendo di cambiare la configurazione, riavviare la macchina, ecc.e devi anche fare in modo che l'applicazione blocchi le chiavi speciali tramite i ganci della tastiera.

Ricordare: non fare affidamento solo su hook, modalità a schermo intero e altre cose che impediscono all'utente di uscire dall'applicazione. Se lo fai, un giorno l'applicazione si bloccherà, dando all'utente l'accesso illimitato al sistema operativo, al file system, ecc.

Problemi correlati