Boîtes d'erreur Windows au niveau suivant

15

Vous connaissez ces boîtes Windows où vous ne pouvez faire qu'une seule chose?

Boîte d'erreur Windows: la procédure supprimera le contenu de votre disque dur.  Qu'est-ce que tu veux faire?  <Procéder> <Supprimer>

Prenons cela au niveau suivant!

Défi

Créez une boîte de dialogue avec un bouton qui suit votre curseur partout!

Spécifications

Aucune entrée ne peut être prise. Il peut y avoir une sortie vers STDOUT ou STDERR. Vous devez ouvrir une fenêtre avec un bouton (aucun texte n'est nécessaire, mais le texte peut être contenu dans le titre de la fenêtre, la boîte de dialogue ou le bouton). Le bouton doit être cliquable, et il doit toujours suivre sous votre curseur pour que vous ne puissiez que le cliquer. En cliquant, il peut faire tout ce que vous voulez, mais s'il vous plaît ne le faites pas planter un ordinateur car je vais tester cela ... La boîte de dialogue doit rester ouverte tant que le bouton n'est pas enfoncé, mais il n'a pas besoin de fermer lorsque le bouton est fermé.

Hypothèses que vous pouvez formuler

  • Vous pouvez supposer que le curseur restera dans la zone de dessin.
  • Vous pouvez supposer que la fenêtre restera au point, mais vous ne devez pas la mettre au point tant que le bouton n'est pas enfoncé.

Exemple de pseudocode

Voici un exemple de pseudocode:

Open Dialog Box
Add Button to Dialog Box at position X, Y
WHILE True:
    SET Dialog Box to CursorX - X, CursorY - Y

Les cas de test ne peuvent pas être fournis pour ce défi

Il s'agit d'un défi de code-golf, donc la soumission valide la plus courte d'ici le 14 mars (Pi Day) gagne!

HyperNeutrino
la source

Réponses:

9

MATLAB, 86 63 octets

set(warndlg,'WindowButtonM',@(s,e)movegui(get(0,'Po')-[99,20]))

Cette solution tire parti de la capacité (généralement ennuyeuse) de MATLAB à utiliser des noms de propriété partiels tant que la pièce fournie est unique à la propriété d'intérêt uniquement.

Cette solution utilise la fonction intégrée warndlgpour créer une boîte de dialogue d'avertissement avec un bouton "OK". Cette fonction renvoie un figurehandle que nous pouvons ensuite utiliser pour définir le WindowButtonMotionFcnrappel (en utilisant le nom court 'WindowButtonM').

Le rappel qui est évalué chaque fois que le curseur est déplacé dans la fenêtre obtient la position actuelle du curseur (en utilisant la PointerLocationpropriété de l' objet graphique racine , en utilisant son nom court 'Po'). Nous mettons ensuite à jour le Positionde la figure en utilisant moveguiet en spécifiant le nouvel emplacement de la figure après avoir appliqué un décalage de [99, 20]sorte que le curseur soit placé sur le bouton.

Lorsque le bouton est finalement cliqué, le chiffre est supprimé et tous les rappels sont automatiquement libérés.

entrez la description de l'image ici

Suever
la source
Pourriez-vous s'il vous plaît fournir un lien pour tester ce code? Je n'ai pas le logiciel Matlab, et ce code ne fonctionne pas avec Octave (car il n'est compatible qu'avec certains codes Matlab). Merci!
HyperNeutrino
3
@AlexL. Malheureusement, il n'y a pas d'utilitaire en ligne gratuit pour montrer comment ce code fonctionne. Même s'il y en avait, les contrôles de l'interface utilisateur ne seront pas rendus dans l'interface Web. J'ai inclus le GIF pour démontrer le fonctionnement du code.
Suever
Bien. Je ne prendrai pas la peine de tester alors. Bon travail, ayez un +1.
HyperNeutrino
Quelques problèmes sur Windows R2014a. Vous pouvez empêcher la boîte de dialogue de: 1. Déplacer votre souris (avec la boîte de dialogue) vers la barre des tâches (ma barre des tâches se trouve sur le côté droit de l'écran) et la boîte de dialogue cessera de suivre la souris; 2. Déplacer votre souris assez rapidement pour que la souris se trouve en dehors de la boîte de dialogue à n'importe quel cadre, auquel cas la boîte cessera de suivre la souris. Le style de la boîte de dialogue dépend aussi apparemment d'autre chose ... avec le code actuel, ma souris manque à peine le bouton OK, et je dois changer 99 à 120 pour fonctionner. Quoi qu'il en soit, bon travail!
Frenzy Li
C'est ce que je vois de mon point de vue. Ma souris est quelque part près de ce réticule rouge.
Frenzy Li
4

C # (Windows Form Application), 200 114 octets

void F(){var p=Cursor.Position;MouseMove+=(r,t)=>{Controls.Add(new Button());Location=new Point(p.X-30,p.Y-40);};}

Non-golfé

void F()
{
     Controls.Add(new Button());

     MouseMove += (r, t) =>
     {
        var p = Cursor.Position;
        Location = new Point(p.X - 30, p.Y - 40);
     };
}

Ancienne solution à 200 octets:

public void F(){var t=this;var b=new Button();b.Click+=delegate{t.Close();};t.Controls.Add(b);t.Show();for(;;){Application.DoEvents();t.Location=new Point(Cursor.Position.X-30,Cursor.Position.Y-40);}}

Non-golfé

    public void F()
    {
        var t = this;
        var b = new Button();

        b.Click += delegate
        {
            t.Close();
        };

        t.Controls.Add(b);
        t.Show();

        for (;;)
        {
            Application.DoEvents();
            t.Location = new Point(Cursor.Position.X - 30, Cursor.Position.Y - 40);
        }
    }

entrez la description de l'image ici

Oliver
la source
1
Bon travail! +1 :)
HyperNeutrino
1
Attendez .... donc en C #, vous pouvez ajouter un écouteur d'événements en faisant Event += listener? C'est génial :-)
ETHproductions
@ETHproductions Pourrait probablement le faire aussi en C ++ si vous surchargiez l' +opérateur. Toujours très succinct.
Carcigenicate
1

AutoHotkey, 122 115 octets

MsgBox
WinWait,%A_ScriptName%
Loop{
MouseGetPos,x,y
WinGetPos,a,b
ControlGetPos,c,d,,,Button1
WinMove,x+a-c,y+b-d
}

Démo

Kodos Johnson
la source
2
Agréable et simple. Bon travail! +1
HyperNeutrino
1

Java 7, 294 289 286 264 220 octets

import java.awt.*;public class B extends java.applet.Applet{Button b;public B(){add(b=new Button());}public void paint(Graphics g){Point p=MouseInfo.getPointerInfo().getLocation();b.setLocation(p.x-9,p.y-65);repaint();}}

-22 octets grâce à MouseInfo (volé à Zavada ) Je n'aime pas les bibliothèques awt>.>

J'ai réduit 44 octets en supprimant la méthode principale ici. La méthode principale n'est pas nécessaire si elle est lancée sous forme d'applet. Cela peut être réalisé via "Run As Java Applet" d'éclipse ou en désactivant le gestionnaire de sécurité et en utilisant l' appletviewer , qui est fourni avec le JDK (à moins que vous ne puissiez toujours afficher les applets dans les navigateurs Web. Je ne pense pas que Chrome le permette) .

apparaitre

Poussée
la source
Beau travail, +1! Je suis d'accord, les bibliothèques awt sont un peu moches, mais c'est plus golfeur.
HyperNeutrino
Vous pouvez économiser 24 octets en supprimantimport java.awt.event.*;
Zavada
@Zavada Le *caractère générique n'importe pas de manière récursive des sous-packages. J'ai besoin java.awt.eventde MouseAdapteretMouseEvent
Poke
Toutes mes excuses, j'ai eu un brainfart total!
Zavada
1

Java, 172 199 235 octets

Golfé:

import java.awt.*;interface D{static void main(String[]z){new javax.swing.JDialog(){{setSize(9,99);setVisible(1>0);add(new Button());a();}void a(){for(Point p;;p=MouseInfo.getPointerInfo().getLocation(),setLocation(p.x-9,p.y-70));}};}}

Non golfé:

import java.awt.*;
interface D{
    static void main(String[]z){
        new javax.swing.JDialog(){
            {
                setSize(9,99);
                setVisible(1>0);
                add(new Button());
                a();
            }
            void a(){

                for(;;) {
                    Point p = MouseInfo.getPointerInfo().getLocation();
                    setLocation(p.x-9,p.y-70);
                }
            }
        };

    }
}

Explication: J'utilise l'initialisation à double accolade sur ma déclaration d'un nouveau JDialog. Cela a permis d'économiser des octets en excluant l'extension de JDialog (ce qui m'a permis d'enregistrer des octets en excluant publicde main). À l'intérieur de la sous-classe anonyme de JDialog, je la rend visible (en utilisant à la 1>0place de true) et j'appelle a(), ce qui est nécessaire car l'initaliseur a une erreur de compilation si la boucle était normalement installée. J'ai choisi d'utiliser MouseInfo plutôt que tout le code excédentaire associé à l'ajout d'un écouteur de souris.

Edit: a dû augmenter le nombre de 27 à ajouter add(new java.awt.Button());. Je pensais que JDialogs avait un bouton implicite par technicité, mais je semble avoir tort.

Edit 2: J'ai dû ajouter setSizeet décaler l'emplacement de la souris pour rendre le bouton cliquable.

Dialogue

Zavada
la source
Cela ne fonctionne pas tout à fait; Je ne peux pas appuyer sur le bouton car le curseur est constamment dans le coin supérieur gauche de la fenêtre. Veuillez corriger cela! :)
HyperNeutrino
Toutes mes excuses, devraient être corrigées maintenant!
Zavada
Oui. Fonctionne maintenant! +1
HyperNeutrino
Je ne savais pas / je me souviens que MouseInfo était une chose. Ceci est une bonne réponse.
Poke
1
@Poke Merci. J'ai vu votre réponse en utilisant des applets, et j'ai une haine déraisonnable pour les applets, donc j'ai pensé que ce serait mignon de le faire en swing. Votre réponse est sympa cependant :)
Zavada
0

Traitement modifié Js 102 108 octets

draw=function(){background(0);rect(mouseX,mouseY,9,9);rect(mouseX,mouseY,4,4);if(mouseIsPressed){fill(9);}};

Essayez-le en ligne! Je viens de mettre à jour mon lien!

Il dessine simplement un rectangle qui suit votre souris et un petit rectangle à l'intérieur duquel vous cliquez et il devient rouge. Cela fonctionne mais n'est pas étonnant. Cette version est très stricte sur les accolades et tout cela :(

Christophe
la source
Vous pouvez supprimer les accolades autour du remplissage
Kritixi Lithos
@KritixiLithos Je ne peux pas vraiment :(
Christopher
Il s'agit d'une version en langage strictement typé
Christopher
Vous pouvez alors utiliser un autre type de traitement pour économiser des octets
Kritixi Lithos
@KritixiLithos en fait, alors je devrais également configurer une taille d'écran et cela ajouterait des octets. (Note latérale Je viens de recevoir un coup de pied du chat pour "contenu inapproprié, une idée pourquoi? C'était aussi un bot. Chat.stackexchange.com/messages/35631789/history était pourquoi
Christopher
0

Clojure, 525 octets

(ns d(:require[quil.core :as q][quil.middleware :as m]))(def w 500)(def h 200)(def t 30)(def n 200)(def m 100)(q/defsketch d :size[999 999]:setup(fn[](q/stroke 0 0 0)(q/text-font(q/create-font""(* t 1.3))){:x 0 :y 0}):draw(fn[{x :x y :y}](let[r q/rect f q/fill o(- x(/ w 2))p(- y (/ h 2))](q/background 99 99 99)(f 0 0 255)(r o p w h)(f 200 200 200)(r o(+ p t)w(- h t))(f 255 0 0)(r(-(+ o w)t)p t t)(f 255 255 255)(q/text"X"(- (+ o w) t)(+ p t))(r(- x(/ n 2))(- y (/ m 2))n m))):mouse-moved(fn[_ e]e):middleware[m/fun-mode])

Ne crée pas une véritable boîte de dialogue Windows. Au lieu de cela, il en crée un faux et crée un bouton factice (non fonctionnel) au milieu.

Cela a été autorisé par le PO dans les commentaires.

Utilise la bibliothèque Quil .

(ns bits.golf.following-dialog
  (:require [quil.core :as q]
            [quil.middleware :as m]))

(def width 500)
(def height 200)

(def top-bar-height 30)

(def b-width 200)
(def b-height 100)

(defn -main []
  (q/defsketch d
    :size [999 999]
    :setup (fn []
             ; Set the border color
             (q/stroke 0 0 0)

             ; Set the font size
             (q/text-font (q/create-font "" (* top-bar-height 1.3)))

             ; The initial state
             {:x 0 :y 0})

    :draw (fn [{x :x y :y}]
            (let [r q/rect ; Shortcut functions for brevity
                  f q/fill

                  ; The top-left coordinates of the window
                  window-x  (- x (/ width 2))
                  window-y (- y (/ height 2))]

              ; Wipe the previous screen
              (q/background 99 99 99)

              ; Blue top bar
              (f 0 0 255)
              (r window-x
                 window-y
                 width height)

              ; Grey window background
              (f 200 200 200)
              (r window-x
                 (+ window-y top-bar-height)
                 width (- height top-bar-height))

              ; Red top right "button"
              (f 255 0 0)
              (r (- (+ window-x width)
                    top-bar-height)
                 window-y
                 top-bar-height top-bar-height)

              ; The X
              (f 255 255 255)
              (q/text "X" (- (+ window-x width) top-bar-height)
                          (+ window-y top-bar-height))

              ; The main "button"
              (r (- x (/ b-width 2))
                 (- y (/ b-height 2))
                 b-width
                 b-height)))

    ; When the mouse is moved, set the current state to the event object, which
    ;  conveniently has :x and :y properties
    :mouse-moved (fn [_ e] e)

    ; Needed for ease of state management. May try to factor out.
    :middleware [m/fun-mode]))

Faux dialogue

Carcigenicate
la source
Je suis tenté de ne pas voter contre cela parce que votre représentant est 1000 et il a l'air si gentil ... Je vais compter cela comme une solution valide (simplement parce que j'ai déjà validé une solution similaire qui ne crée pas de " véritable "fenêtre"), il faut donc un +1. : P
HyperNeutrino
@HyperNeutrino Merci, même si c'est une surpuissance grossière pour la tâche, et une répétition égale à 1k est agréable. Je me suis bien amusé! Je vais peut-être créer une version AWT aussi juste pour comparaison. Sera probablement comme la moitié de la longueur.
Carcigenicate
Vous pouvez simplement attendre 2k à ce moment-là! : D
HyperNeutrino
0

Pug / Slim + CSS / SCSS / LESS / Stylus + ES6 Javascript (98 octets)

Essayez-le en ligne!

Carlin (10 octets UTF-8)

button#a X

Stylet (18 octets UTF-8)

#a{position:fixed}

JS (70 octets UTF-8)

onmousemove=e=>{with(a.style){top=e.clientY+'px';left=e.clientX+'px'}}

Décompilé, non-golfé et expliqué l'extrait de code:

document.addEventListener('mousemove', function(e) {
  // Get element with an id of "id"
  var el = document.getElementById("id");
  // Set the vertical position
  el.style.top = e.clientY + 'px';
  // Set the horizontal position
  el.style.left = e.clientX + 'px';
})
/* Get element with an id of "id" */

#id {
  /* Position it relative to the viewport*/
  position: fixed;
}
<!-- A basic HTML button with an ID of "id" -->
<button id='id'>
  X
</button>

Geordie Fischer
la source
0

Mathematica 226 octets

La position de la souris par rapport à l'écran est suivie par l'extrémité avant et la position de la fenêtre du carnet de dialogue est déplacée chaque fois que la souris se déplace. Assez simple, mais les commandes sont très longues en termes de lettres, comme c'est souvent le cas avec Mathematica. Cliquez sur OK pour fermer la boîte de dialogue.

{s,d,w}={SetOptions,Dynamic,WindowMargins->m};With[{p=d@MousePosition["ScreenAbsolute"]},
m=d@{{p[[1]]-50,0},{0,p[[2]]-35}}];s[$FrontEndSession,FrontEndEventActions->{"MouseMoved":>s[a,w]}];a=CreateDialog[{DefaultButton[]},w];

PS Lorsque vous avez terminé les tests, exécutez-le pour supprimer l'option front-end.

SetOptions[$FrontEndSession,FrontEndEventActions->None]

animation d'écran

Kelly Lowder
la source
Pouvez-vous ajouter un gif pour prouver la fonctionnalité? Je ne peux pas tester Mathematica. Merci!
HyperNeutrino
-1

Javascript (ES6) + HTML + CSS, 139 octets

HTML:

<d id=d><button>X

CSS:

d{background:red;padding:9px;position:absolute

Javascript:

onmousemove=e=>{with(d.style){top=e.clientY-20+'px';left=e.clientX-20+'px'}}

Comme vous ne pouvez pas positionner les boîtes de dialogue d'alerte, j'ai créé ma boîte de dialogue personnalisée de super fantaisie en HTML. Le javascript enregistre un gestionnaire d'événements sur l'objet fenêtre et définit la position sur les coordonnées de l'événement.

Essayez-le en ligne: https://jsfiddle.net/1yohswje/

corvus_192
la source
Je vais dire que ce n'est pas valide, car cela ne crée rien de semblable à une "fenêtre" légitime, et aussi, vous ne pouvez pas dire que c'est censé être une fenêtre avec un bouton. Mais c'est une solution intéressante!
HyperNeutrino
@HyperNeutrino J'ai mis à jour ma réponse. Que pensez-vous de cela?
corvus_192
D'accord. Cela est conforme à mes normes maintenant. Avoir un +1
HyperNeutrino