12
votes

Application coincée en plein écran?

Pour reproduire mon problème, veuillez procéder comme suit:

  1. Créez une nouvelle application de formulaire Windows en C #.
  2. Dans la fenêtre Propriétés de Form1 Set FORMBORDERSTYLE TO Aucun .
  3. Programme de lancement et appuyez sur Windows + UP .
  4. Vous êtes maintenant coincé en plein écran.

    Dans la valeur par défaut Formborderstyle Réglage de la propriété Maximizebox La propriété sur False désactivera le Windows + Raccourci complet .

    Si le Formborderstyle est défini sur Aucun Microsoft a décidé qu'il serait judicieux de désactiver toutes les raccourcis de la touche Windows + flèche, à l'exception de la flèche vers le haut, puis de la conversation. Désactivation de la propriété Maximizebox .

    Est-ce un problème? Tout simple way to Désactiver ce raccourci fonction de la manière SelfSame IT est désactivée sur tous les autres formulaires de formulaire ?


6 commentaires

Cela pourrait ne pas être une solution, mais si vous donnez MaximumSizeSize du formulaire, qui limitera automatiquement votre formulaire pour aller en mode plein écran.


J'ai essayé de changer Maximizedbounds à la taille actuelle mais qui ne résout pas le problème du tout. Tout d'abord, il déplace toujours le formulaire et fait donc de tirer cet événement de raccourci qui n'aurait jamais dû être activé en premier lieu. En outre, en jouant avec MaximumSize , il interférera avec des fonctions de redimensionnement personnalisées.


Je ne sais pas si c'est un problème, mais vous pouvez utiliser une solution de contournement: Stackoverflow.com/Questtions/1295999/...


Je ne veux pas contenter du fait que cela a été maximisé ou que cela ressemble à ce qu'il n'était pas maximisé, je veux le rendre exactement comme si Maximizebox est faux pour tout autre Formborderstyle Je ne veux pas que l'événement soit tiré du tout parce que je souhaite mettre en place une nouvelle interface pour maximiser et minimiser, comme un bouton personnalisé.


Dupliqué possible de Empêcher WinForm d'être maximisé?


La question est très similaire et j'ai trouvé certaines des réponses plutôt utiles. Cependant, mon objectif n'est pas de désactiver la maximisation car je souhaite avoir mon propre moyen de redimensionner / maximiser / minimiser. Mon objectif est de simplement désactiver la fonction Windows + up dans une forme de formulaire de formulaire de formulaire similaire à tous les autres formulaires de formulaires.


4 Réponses :


2
votes

remplacer le processcmdkey code> (méthode protégé sous formulaire) nous permet d'appliquer un crochet personnalisé et peut être utilisé dans votre scénario. Cela nous permettra essentiellement de remplacer la manipulation de Keystroke intégrée.

Note Strong>: Exemple suivant Démontrez l'idée de gérer une touche ou une combinaison différente de celui-ci. Maintenant, vous devez probablement affiner le code suivant pour travailler en ligne avec votre scénario. Par exemple: Modification idéalement la modification du formulaire code> ou ou lorsque l'utilisateur appuyez sur le lwin + up code> flèche. EM> P>

public partial class Form1 : Form
    {


        // Structure contain information about low-level keyboard input event
        [StructLayout(LayoutKind.Sequential)]
        private struct KBDLLHOOKSTRUCT
        {
            public Keys key;
            public int scanCode;
            public int flags;
            public int time;
            public IntPtr extra;
        }

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

        public Form1()
        {
            ProcessModule objCurrentModule = Process.GetCurrentProcess().MainModule;
            objKeyboardProcess = new LowLevelKeyboardProc(captureKey);
            ptrHook = SetWindowsHookEx(13, objKeyboardProcess, GetModuleHandle(objCurrentModule.ModuleName), 0);


            InitializeComponent();
        }

        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) // Disabling Windows keys
                {
                    return (IntPtr)1;
                }
            }
            return CallNextHookEx(ptrHook, nCode, wp, lp);
        }



        private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
            MessageBox.Show(e.KeyChar.ToString());
        }


    }


7 commentaires

si (keydata == (keys.lwin | keys.up)) est évalué false lorsque j'appuie sur les deux touches et qu'il se verrouille toujours en plein écran.


Je ne sais pas pourquoi ça ne marche pas. Mais ça marche dans mon cas. Pourrait être quelque chose que j'ai manqué à mentionner. Ref: msdn.microsoft.com/fr- GB / Bibliothèque / ...


Définissez votre Formborderstyle sur Aucun et utilisez le même code que vous avez publié et appuyez sur Windows + Up, il ne l'enregistrera pas. J'ai essayé de mettre une boîte à la fois dans le code et il ne enregistrera pas les deux touches en même temps, mais la fonction de clé d'échappement fonctionne bien.


Cela ne désactiverait-il pas Win + Up pour l'ensemble du système? Vous pouvez ajouter un chèque pour voir si l'application de premier plan était la vôtre et ne consommez que la touche de frappe.


@Nair Vous devez supprimer le premier code dans votre réponse, ne conserver que le second et ajouter du code pour enregistrer le crochet dans un gestionnaire d'événements activé et désenregistrer le crochet dans un gestionnaire d'événements de désactivation. Je l'ai testé et ça marche très très bien. C'est vraiment ce que l'OP veut. Vous donner +1 pour le deuxième code.


+1 Pour le code, mais cela fait plus que ce que j'ai demandé, car il est désactivé entièrement la clé Windows + UP pour toutes les applications et je ne sais pas que commencer à faire ce que le roi King King a suggéré. Vous devez supprimer la première partie de votre code sur le LWIN + UP car le processcmdkey n'est pas capable de détecter ces clés simultanément pour une raison quelconque.


Il suffit de confirmer que la touche Win + UP n'est pas passée via la méthode ProcessCMDKey. Il peut être démontré en mettant MessageBox.show dans la méthode ProcessCMDKey. Quelle méthode est-elle transmise ce raccourci? Rien?



2
votes

6 commentaires

Ce que je ne comprends pas, c'est régler le maximisé sur false pour tout autre formulaire de formulaire empêchera la touche Windows de la définir à un état maximisé. Y a-t-il de toute façon que je puisse tout éviter de la fixer à un état maximisé sans gâcher l'état maximisé. Supposons que je veux un moyen personnalisé de maximiser ma forme. Je veux juste que les fenêtres redoutées + devraient arrêter de jouer avec moi.


Bon point et question ... doit enquêter plus loin dans la matinée.


Vous pouvez toujours autoriser un état maximisé lorsque vous souhaitez en modifier les valeurs transmises à la structure MINMAXInfo.


Le code semble désactiver Lwin + Up, mais il désactive également l'utilisateur maximisant le formulaire par code (tel que WindowState = formwindowstate.maximisé). Cependant, je veux toujours vous donner +1.


Ouais ... Vous devriez ajouter du code / variables supplémentaires pour permettre / suivre un état maximisé et transmettre des valeurs différentes à la structure MINMAXInfo en conséquence.


+1 pour ce code parce que cela résoudra vraiment le problème avec le moins de dégâts. J'aimerais juste avoir un moyen d'intercepter la commande Win + Up avec le processcmdkey ou une autre manière comme celle-ci. Par exemple, je veux peut-être que Win + up pour faire le formulaire plein écran sur tous les moniteurs en ce moment, j'ai un bouton séparé pour cela sous mon formulaire, mais je souhaite peut-être que ce raccourci pour le faire aussi.



1
votes

Vérifiez cette solution - il supprime optimiser / minimiser / Titlebar / Border par des appels API.

MaximizeBox = false;
FormBorderStyle = FormBorderStyle.Sizable;
HideMinimizeAndMaximizeButtons();
FormBorderStyle = FormBorderStyle.None;
MaximizeBox = true;
MaximizeBox = false;
HideMinimizeAndMaximizeButtons();
FormBorderStyle = FormBorderStyle.None;
HideMinimizeAndMaximizeButtons();


15 commentaires

Avec tous les autres formes de formulaire Maximizebox = FALSE Désactive Le raccourci Windows + Up sans modifier d'autres propriétés que je connais. De plus, votre solution entraîne toujours le scintillement dans l'ensemble de l'écran lorsque Windows + UP est enfoncé et que si je souhaite faire Windows + up faire autre chose. Toutes ces solutions sont des travaux horribles sur un problème simple. Je veux le Windows + up pour se comporter de selfseame comme lorsque le Maximizebox est désactivé pour tout autre Formborderstyle . Tous ces facteurs sont importants car je développe des mécanismes de redimensionnement hautement personnalisés.


Jeffrson Cette réponse provoque le même effet secondaire de la désactivation this.windowstate = formwindowstate.maximized.Maximized; comme réponse de l'IDLE_MIND mais provoque un effet secondaire supplémentaire du scintillement de l'écran. J'aimerais vraiment que cette question réponde sans un travail fou. J'aimerais qu'il y ait une façon de faire le fonctionnement de la propriété Maximizebox comme s'il s'agissait d'un autre Formborderstyle sans changer quoi que ce soit d'autre.


Ok - je pensais que vous ne voulez tout simplement pas être bloqué en mode maximisé lorsqu'une situation rare d'appuyer sur ce combo à clé se produit. Maintenant, j'ai retravaillé l'extrait - veuillez vérifier.


Merci jeffson Toutes les réponses ici toutes les personnes fournies sont superbes mais les vôtres accomplissent exactement ce que je veux juste pas dans une simple voie (pour moi) (c'était à prévoir). Toutefois, si vous pouviez ajouter 3 choses à votre message, je vous donnerai immédiatement le représentant de +300.


1) Il semble Formborderstyle = aucun n'est identique à la même chose exacte que le code que vous venez de fournir placé sur n'importe quel autre Formborderstyle moins l'horrible Glitch de Maximizebox ne fonctionne pas. Existe-t-il d'autres différences entre ce personnalisé FORMBORDERSTYLE et FORMBORDERSTYLE = Aucun? 2) J'ai demandé simple et pour moi, je n'aurais jamais pu implémenter cela avec juste ma créativité logique. Pouvez-vous s'il vous plaît expliquer la ligne par ligne avec des commentaires ce que chaque chose fait exactement comme si je n'avais aucune idée de la programmation en dehors de la langue gérée C #. 3) Sources pour les valeurs.


1) Eh bien, je ne suis pas sûr, je suis peut-être un look dans le réflecteur pour voir ce que fait Formborderstyle.none réellement. Pourrait faire cela demain (trop tard aujourd'hui). Cependant, c'est le code (Setwindowlong A.S..o.) que vous utiliseriez probablement dans Native C ++, où il n'y a pas de propriété de formulaire.


2) Eh bien, c'est en fait simple. Bien que je n'étais pas sûr si cela réussit, j'ai essayé de définir ces propriétés comment je le ferais en C ++. Toutefois, vous devez savoir que vous devez manipuler le style de la fenêtre, ce qui n'est pas magique si vous recherchez, disons, comment cacher les boutons maximiser / minimiser. Vous trouverez des références à Setwindowlong avec des exemples. Ensuite, vous recherchez MSDN pour SetWindowlong et lisez sur les styles Windows. Ceci est la fonction qui définit les propriétés de la fenêtre sous-jacente. Les styles sont combinés à un peu ou ou enlevés par un drapeau négatif combiné avec et.


C'est une question de trouver tous les drapeaux. C'est là que les styles étendus entrent. Il peut ne pas être nécessaire de les éliminer, mais il ne peut pas nuire. 3) Les valeurs peuvent être trouvées dans la documentation de l'API MSDN (voir SetWindowlong par exemple) ou dans le fichier Windows SDK (WinUser.h) dans le passé, vous deviez regarder MSDN pour les noms de constantes et les rechercher dans SDK incluent les fichiers. De nos jours, MSDN contient déjà ces valeurs qui sont évidemment très utiles.


Jeffrson Pensez-vous que vous pouvez trouver avec le réflecteur comment l'autre formulaire de formulaire désactive les fenêtres + avec la propriété Maximizebox?


Eh bien, il y a apparemment un bug dans le cadre. Je n'ai pas comparé tous les drapeaux (ils fonctionnent avec des numéros de drapeau combinés tels que 268435456), mais lorsque j'ai lu des styles (Getwindowlong), après avoir défini le formulaire de formulaire de formulaire, je vois que le drapeau MaximizeBox (0x00010000) est défini (même si forme.maximzebox est faux). C'est pas le cas avec d'autres styles! Maintenant que cela signifie que c'est suffisant, après avoir défini le formulaire de formulaire à Aucun pour simplement appeler HideminImizeandMaximizebuttons () - vous pouvez même limiter à simplement supprimer le drapeau WS_MAXIMIZEBOX uniquement.


Enfin, en comparant des drapeaux, je peux confirmer que le style personnalisé Néant (:-) (:-)) définit exactement les mêmes drapeaux que l'un intégré (à part WS_MAXIMIZEBOX, bien sûr).


J'aimerais voir le programme que vous avez utilisé pour répertoriez tous les drapeaux et les a comparés à ceux-ci ou le processus exact afin que je puisse passer à autre chose à des fins de curiosité et d'éducation, bien que vous sachiez à peu près à vous-même expliciter. En fait, la réponse exacte que je cherche est dans ce commentaire ici !!! Le drapeau MaximizeBox (0x00010000) est défini (même si form.maximzebox est faux). Ce n'est pas le cas avec d'autres styles! Cela répond directement directement directement à ma question, merci beaucoup! Bien que vous me donniez suffisamment d'informations pour créer mon propre formulaire de formulaire de formule.


Eh bien, le programme que j'ai utilisé est principalement celui qui a un peu changeant de manière interactive la séquence de paramètres de formulaire de formulaire, MaximizeBox, MinimizeBox et appelez HideminImizeAndMaximizebuttons et / ou HIDERFORDER pour lire le style et le style étendu. Je laisse le débogueur montrer les valeurs à Hex. Tel peut facilement voir quel drapeau est défini (pouvoir de 2 pour chaque position). Le seul changement que je ferais est de mettre le changement de style dans une ligne séparée afin de vérifier si la valeur change de l'assentiment. Telle, vous obtenez une ligne supplémentaire comme style = style & ~ ws_maximzebox et ~ ws_minimizebox .


N'importe quand! Je voulais vraiment cette réponse et je vous ai donné toute ma réputation parce que c'est à quel point c'était frustrant pour moi de travailler autour de cela en désactivant la caractéristique maximale haha. Pouvez-vous ajouter votre dernière suggestion dans une partie séparée de votre message?


D'accord, a ajouté quelques déclarations sur ces valeurs de style.



7
votes

Windows le fait en appelant SetWindowPos () pour modifier la position et la taille de la fenêtre. Une fenêtre peut être notifiée à ce sujet en écoutant le message WM_WindowEowPoschanging et remplacement les paramètres. Beaucoup de choses que vous pouvez faire, comme pour donner au fonctionnement une signification en ajustant la taille et la position à votre goût. Vous l'empêchez complètement en allumant les drapeaux Nosize et Nomove.

Coller ce code dans votre formulaire: xxx

Lorsque vous souhaitez modifier vous-même la fenêtre, définissez simplement le AutoryWindowChange champ temporairement à true.


1 commentaires

Merci pour cette réponse. C'est assez soigné et j'aime comment vous l'avez fait toggle. Je vais absolument utiliser cela pour une autre fois, mais pour le moment, je pense que je vais coller avec quelque chose comme la réponse de Jeffrson qui me permettra de désactiver les fenêtres + up dans une offre de formulaire de fortune Néanmique, car c'est la solution la moins indirecte.