Προς το περιεχόμενο

WIn32 API - Full Screen Window


moukoublen

Προτεινόμενες αναρτήσεις

  • Απαντ. 41
  • Δημ.
  • Τελ. απάντηση
Δημοσ.

Ωπα της... Διαβαζουμε και the old new things grin.png

 

Απ' όλα έχουμε διαβάσει (και διαβάζουμε) ;)

 

@defacer: γνωρίζουμε τι ζήτησε ο ts! Το ότι μιλάμε και για modality γενικώς στα Windows είναι στα ευρύτερα πλαίσια της συγκεκριμένης συζήτησης.

 

...

Ας μη μπερδεύουμε το input focus με την έννοια του foreground window γιατί άλλα θα εννοεί ο ένας κι άλλα θα καταλαβαίνει ο άλλος.

...

Ουδέποτε μίλησα για input focus, προς τι αυτό το σχόλιο;

Δημοσ.

Εισαι αψυχολογητοςhappy.gif

 

Είμαι... για να σας κρατάω σε εγρήγορση. :-D

 

Ουδέποτε μίλησα για input focus, προς τι αυτό το σχόλιο;

 

Αυτό που ήθελα να πω είναι ότι χρησιμοποίησες λάθος όρο ("focus") ενώ θα technically correct είναι foreground window με disabled parent. Ή με άλλα λόγια ότι το να πεις "Όχι, focus εννοούμε εστίαση στο προσκήνιο" θα οδηγήσει σε ασυνεννοησία αν μιλάς σε κάποιον που ξέρει τι είναι focus, και σε μπέρδεμα αν μιλάς σε κάποιον που δεν ξέρει.

 

Nitpicking I know.

Δημοσ.

"Focus" είναι το σε ποιό window πηγαίνει το keyboard input. Αυτό συνήθως είναι control και όχι αυτό που ο χρήστης αντιλαμβάνεται ως "παράθυρο", οπότε δεν έχει και πολύ σχέση με τη συγκεκριμένη συζήτηση.

 

"Activation" αναφέρεται στο ποιό top-level window είναι ενεργοποιημένο. Ο χρήστης αντιλαμβάνεται ως "παράθυρα" μόνο τα top-level windows (αφήνω απέξω κάποιες εξαιρέσεις χάριν συντομίας), οπότε το top-level window που είναι ταυτόχρονα και active είναι αυτό που ο χρήστης αντιλαμβάνεται ως "το ενεργό παράθυρο".

 

Εδώ θέλει πάλι προσοχή: το "top-level window" δεν έχει καμία σχέση με το TOPMOST style.

 

To focused window είναι πάντα AFAIK descendant του active window.

 

Αυτή τη στιγμή που γράφω πχ top level active είναι ο Firefox αλλά focus έχει ένα textbox control.

 

Επίσης πχ, technically η απορία του OP θα διατυπωνώταν ως "πώς μπορώ να εξασφαλίσω ότι το top level window της εφαρμογής μου δε θα γίνει ποτέ inactive".

Δημοσ.

Μαλιστα καλα το καταλαβα. Focus <=> αφουγκραζεται το input. Focused window (ειναι το ιδιο με το πρωτο εφοσον ολα ειναι window)

Δημοσ.

Εγώ πάλι παίδες, ξεχωρίζω τα windows από τα controls. Λέγοντας σκέτο focus εννοώ για windows (αν και δεν συνηθίζω αυτή τη λέξη, χρησιμοποιώ active/inactive), ενώ όταν θέλω να αναφερθώ σε input focus, το λέω control focus ή input focus.

 

Το βασικό είναι το γενικότερο context της κουβέντας, οπότε εφόσον μιλάγαμε για παράθυρα το focus το εξέλαβα για παράθυρα (δεν μιλάγαμε για controls).

 

Δεν υπάρχει στάνταρ δλδ πως ο όρος focus αναφέρεται μονάχα σε controls... π.χ. http://pcsupport.about.com/od/windowsxp/ht/stealingfocus01.htm ή http://en.wikipedia.org/wiki/Focus_%28computing%29#Window_focus

Δημοσ.

Εγώ πάλι παίδες, ξεχωρίζω τα windows από τα controls. Λέγοντας σκέτο focus εννοώ για windows (αν και δεν συνηθίζω αυτή τη λέξη, χρησιμοποιώ active/inactive), ενώ όταν θέλω να αναφερθώ σε input focus, το λέω control focus ή input focus.

 

Το βασικό είναι το γενικότερο context της κουβέντας, οπότε εφόσον μιλάγαμε για παράθυρα το focus το εξέλαβα για παράθυρα (δεν μιλάγαμε για controls).

 

Δεν υπάρχει στάνταρ δλδ πως ο όρος focus αναφέρεται μονάχα σε controls... π.χ. http://pcsupport.about.com/od/windowsxp/ht/stealingfocus01.htm ή http://en.wikipedia.org/wiki/Focus_%28computing%29#Window_focus

 

 

Απλά το θέμα είναι πως προσεγγίζει κανείς τους όρους. Αν προσεγγίζεις από την πλευρά του χρήστη, focus είναι OK. Αν προσεγγίζεις από πλευρά Win32 developer, active είναι το σωστό και focus σημαίνει κάτι άλλο.

 

@migf1: Γι' αυτό ακριβώς είχα κάνει εκείνο το πρώτο σχόλιο λίγο λακωνικά: για να πω ότι προσοχή αρχίζουμε να πλησιάζουμε σε περιοχή με λεπτό πάγο ορολογίας χωρίς να γίνει hijack το topic όπως τελικά κατέληξε. :-D Είναι βέβαια γεγονός ότι σε κείνη τη φάση απευθυνόσουν σε user και όχι σε developer.

Δημοσ.

Ελα μωρε.. Κουβεντα να γινεται. Εδω και ενα μηνα το σεκτιον εχει πεθανει frown.png ας του δωσουμε λιγη ζωη μπας και μπει φρεσκο αιμα happy.gif

Δημοσ.

...

Εδω και ενα μηνα το σεκτιον εχει πεθανει frown.png ας του δωσουμε λιγη ζωη μπας και μπει φρεσκο αιμα happy.gif

 

 

Να ανοίξω θέμα με εκείνη τη ναυμαχία, που ακόμα δεν έχω καταφέρει να φτιάξω το AI της; Μου έχει βγάλει την ψυχή μιλάμε! Έχω αλλάξει πάνω από 4-5 φορές τη δομή του ai-engine, δοκιμάζοντας διάφορους αλγόριθμους... αλλά τζίφος. Τελικά αποφάσισα να το κάνω έτσι: http://arnosoftwaredev.blogspot.com/2008/06/battleship-game-algorithm-explained.html, αλλά και πάλι χρειάζονται δομικές αλλαγές, κι έχω χάσει λίγο την μπάλα :lol:

 

 

Δημοσ.

φίλε μου, εχω φτιάξει κάτι αντίστοιχο.

αν θέλεις να μην μπορεί να χάσει το focus θα πρέπει να απενεργοποιήσεις το windows key (με global keyboard hook)

να αφήσεις τον task manager να τρέχει σε αλλο desktop, η να τον παρακάμψεις με άλλο τρόπο.

να απενεργοποιήσεις το TAB (ώστε να μην λειτουργεί το alt+tab) και να προσέξεις και 1-2 άλλα shortcuts. αν θέλεις στείλε μου μήνυμα να σου δώσω έτοιμο κώδικα.

 

έλα ορίστε για να μην μιλάμε αόριστα, παραθέτω κώδικα C#

 

//HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\shell //Gia apenergopoihsh tou explorer

//HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System //Gia apenergopoihsh tou WinKey+L

 

 

 

>        [structLayout(LayoutKind.Sequential)]
       private struct KBDLLHOOKSTRUCT
       {
           public Keys key;
           public int scanCode;
           public int flags;
           public int time;
           public IntPtr extra;
       }



       [structLayout(LayoutKind.Sequential)]
       private struct KBDLLHOOKSTRUCT
       {
           public Keys key;
           public int scanCode;
           public int flags;
           public int time;
           public IntPtr extra;
       }


       //System functions to be used for hook and unhook keyboard input

       private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
       [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
       private static extern IntPtr SetWindowsHookEx(int id, LowLevelKeyboardProc callback, IntPtr hMod, uint dwThreadId);
       [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
       private static extern bool UnhookWindowsHookEx(IntPtr hook);
       [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
       private static extern IntPtr CallNextHookEx(IntPtr hook, int nCode, IntPtr wp, IntPtr lp);
       [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
       private static extern IntPtr GetModuleHandle(string name);
       [DllImport("user32.dll", CharSet = CharSet.Auto)]
       private static extern short GetAsyncKeyState(Keys key);



       //Declaring Global objects
       private IntPtr ptrHook;
       private LowLevelKeyboardProc objKeyboardProcess;





       private IntPtr captureKey(int nCode, IntPtr wp, IntPtr lp)
       {
           if (nCode >= 0)
           {
               KBDLLHOOKSTRUCT objKeyInfo = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lp, typeof(KBDLLHOOKSTRUCT));

               if (objKeyInfo.key == Keys.RWin
                   || objKeyInfo.key == Keys.LWin
                   || objKeyInfo.key == Keys.Alt
                   || objKeyInfo.key == Keys.Escape
                   || objKeyInfo.key == Keys.LControlKey
                   || objKeyInfo.key == Keys.RControlKey
                   || objKeyInfo.key == Keys.Tab
                   || objKeyInfo.key == Keys.PrintScreen
                   || objKeyInfo.key == Keys.RShiftKey
                   || objKeyInfo.key == Keys.LShiftKey
                   || objKeyInfo.key == Keys.F1
                   || objKeyInfo.key == Keys.F2
                   || objKeyInfo.key == Keys.F3
                   || objKeyInfo.key == Keys.F4
                   || objKeyInfo.key == Keys.F5
                   || objKeyInfo.key == Keys.F6
                   || objKeyInfo.key == Keys.F7
                   || objKeyInfo.key == Keys.F8
                   || objKeyInfo.key == Keys.F9
                   || objKeyInfo.key == Keys.F10
                   || objKeyInfo.key == Keys.F11
                   || objKeyInfo.key == Keys.F12
                   || objKeyInfo.key == Keys.RMenu
                   || objKeyInfo.key == Keys.LMenu
                   || objKeyInfo.key == Keys.Pause
                   || objKeyInfo.key == Keys.Delete)

               // Disabling Windows keys
               {
                   return (IntPtr)1;
               }
           }

           return CallNextHookEx(ptrHook, nCode, wp, lp);
       }

 

και στη συνέχεια στον κατασκευαστική της κλάσης (εκεί που γίνεται δηλαδή το InitializedComponents)

 

 

>        public frmShield()
       {
           ProcessModule objCurrentModule = Process.GetCurrentProcess().MainModule; //Get Current Module
           objKeyboardProcess = new LowLevelKeyboardProc(captureKey);  //Assign callback function each time keyboard process
           ptrHook = SetWindowsHookEx(13, objKeyboardProcess, GetModuleHandle(objCurrentModule.ModuleName), 0);

//Setting Hook of Keyboard Process for current module

           InitializeComponent();

       }

επίσης... για να αποφύγεις τον taskmanger

 

ενας εύκολος και απλός τρόπος ειναι ο ακόλουθος..

 

>        public void HideTaskmgr()
       {
           Process task = new Process();
           task.StartInfo.FileName = "taskmgr.exe";
           task.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
           task.Start();
       }

και επειδή καταλαβαίνω που το πας... πάρε και μερικά ακόμα για να έχεις=)

 

documentaion δεν θα χρειαστείς, τα λέει όλα το function name...

 

ως τόσο, ότι θέλεις με ρωτάς.

>        public void MakeThemHidden(string AppPath, Boolean yes)
       {
           string[] fileList = Directory.GetFiles(AppPath);
           if (yes == true)
           {

               foreach (string CurrentFile in fileList)
               {
                   FileInfo CurrentFileInfo = new FileInfo(CurrentFile);
                   if (CurrentFileInfo.Exists == true)
                   {
                       if ((CurrentFile.ToString().EndsWith(".exe"))
                       || (CurrentFile.ToString().EndsWith(".dll"))
                       || (CurrentFile.ToString().EndsWith(".dew")))
                       {
                       }
                       else
                           File.SetAttributes(CurrentFile, FileAttributes.Hidden);
                   }
               }
           }
           else if (yes == false)
           {
               foreach (string CurrentFile in fileList)
               {
                   FileInfo CurrentFileInfo = new FileInfo(CurrentFile);
                   if (CurrentFileInfo.Exists == true)
                   {
                      
                           File.SetAttributes(CurrentFile, FileAttributes.Normal);
                   }
               }
           }
       }





       #region Regedit
       
       public void DisableCtrlAltDel()
       {
           RegistryKey regkey;
           string keyValueInt = "1";
           string subKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";

           try
           {
               regkey = Registry.CurrentUser.CreateSubKey(subKey);
               regkey.SetValue("DisableTaskMgr", keyValueInt);
               regkey.Close();
           }
           catch { }
       
       }
       public void EnableCtrlAltDel()
       {
           
           string subKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";

           try
           {
               Registry.CurrentUser.DeleteSubKey(subKey);
           }
           catch { }

       }

       public void DisableExplorer(string appPath)
       {
           RegistryKey regKey;
           string subKey = "\\SOFTWARE\\Microsoft\\Windwows NT\\CurrentVersion\\Winlogon";

           try
           {
               regKey = Registry.CurrentUser.CreateSubKey(subKey);
               //                regKey = Registry.LocalMachine.CreateSubKey(subKey);
               regKey.SetValue("Shell", appPath);
           }
           catch { }
       }
       public void EnableExplorer()
       {
           RegistryKey regKey;
           string subKey = "\\SOFTWARE\\Microsoft\\Windwows NT\\CurrentVersion\\Winlogon";

           try
           {
               regKey = Registry.LocalMachine.CreateSubKey(subKey);
               regKey.SetValue("Shell", "explorer.exe");
           }
           catch { }
       }

       public void ShowHiddenFiles(Boolean yes)
       {
           RegistryKey regKey;
           string subKey = "\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\Folder\\Hidden\\SHOWALL";


           try
           {

               regKey = Registry.LocalMachine.CreateSubKey(subKey);

               if (yes == true)
               {
                   regKey.SetValue("CheckedValue", "1");
               }
               else
               {
                   Registry.LocalMachine.DeleteSubKey("CheckedValue");
               }
           }
           catch { }
       }

 

thank you fellas.

επίσης αν θέλεις όλα αυτά μπορώ να σου τα δώσω σε ένα κλειστό dll αρχείο, με static classes που τα κάνουν όλα τσακ μπαμ.

 

Υ.Γ !!! προσοχή στη χρήση του global windows hook

 

 

ααα. και να μην ξεχάσω... θα χρειαστείς επίσης τα εξής:

 

>        private System.ComponentModel.IContainer components = null;

       /// <summary>
       /// Clean up any resources being used.
       /// </summary>
       /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
       protected override void Dispose(bool disposing)
       {
           if (disposing && (components != null))
           {
               components.Dispose();
           }
           base.Dispose(disposing);
       }

 

 

 

 

>        private void frmShield_FormClosing(object sender, FormClosingEventArgs e)
       {
            e.Cancel = true;
            base.OnClosing(e);
       }

(αν δεν θες να κλείνει για κανένα λόγο)

 

και κάτι τελευταίο... μην χρησιμοποιήσεις κώδικα που δεν καταλαβαίνεις τι κάνει. θα σου σαπίσει το σύστημα και την registry:D

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...