Windows Error Boxes auf die nächste Ebene

15

Sie kennen die Windows-Boxen, in denen Sie nur eines können?

Windows Error Box: Wenn Sie fortfahren, wird der Inhalt Ihrer Festplatte gelöscht.  Was möchten Sie tun?  <Weiter> <Löschen>

Lassen Sie uns dies auf die nächste Stufe bringen!

Herausforderung

Erstellen Sie ein Dialogfeld mit einer Schaltfläche, die Ihrem Cursor überall folgt!

Technische Daten

Es dürfen keine Eingaben gemacht werden. Es kann entweder STDOUT oder STDERR ausgegeben werden. Sie müssen ein Fenster mit einer Schaltfläche öffnen (es ist kein Text erforderlich, der Text kann jedoch entweder im Fenstertitel, im Dialogfeld oder in der Schaltfläche enthalten sein). Die Schaltfläche muss anklickbar sein und muss immer unter Ihrem Cursor stehen, damit Sie nur darauf klicken können. Wenn Sie auf klicken, kann es alles tun, was Sie wollen, aber machen Sie es bitte nicht zum Absturz eines Computers, da ich dies testen werde ... Das Dialogfeld muss so lange geöffnet bleiben, wie die Schaltfläche nicht gedrückt wird, muss es aber nicht Schließen, wenn die Schaltfläche geschlossen ist.

Annahmen, die Sie treffen können

  • Sie können davon ausgehen, dass der Cursor im Zeichenbereich bleibt.
  • Sie können davon ausgehen, dass das Fenster im Fokus bleibt, aber Sie dürfen das Fenster nicht unscharf stellen, solange die Taste nicht gedrückt wird.

Beispiel Pseudocode

Hier ist ein Beispiel für einen Pseudocode:

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

Testfälle können für diese Herausforderung nicht bereitgestellt werden

Dies ist eine Code-Golf-Herausforderung, daher gewinnt die kürzeste gültige Einsendung bis zum 14. März (Pi-Tag)!

HyperNeutrino
quelle

Antworten:

9

MATLAB, 86 63 Bytes

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

Diese Lösung nutzt die (normalerweise ärgerliche) Möglichkeit von MATLAB, Namen von Teileigenschaften zu verwenden, solange das bereitgestellte Teil nur für die Eigenschaft von Interesse eindeutig ist.

Diese Lösung verwendet das eingebaute Symbol warndlg, um einen Warndialog mit der Schaltfläche "OK" zu erstellen. Diese Funktion gibt ein figureHandle zurück, mit dem wir den WindowButtonMotionFcnCallback setzen können (unter Verwendung des Kurznamens 'WindowButtonM').

Der Rückruf, der jedes Mal ausgewertet wird, wenn der Cursor innerhalb des Fensters bewegt wird, erhält die aktuelle Position des Cursors (unter Verwendung der PointerLocationEigenschaft des Stammgrafikobjekts unter Verwendung seines Kurznamens 'Po'). Wir aktualisieren dann die Positionder Figur, moveguiindem wir die neue Position der Figur nach dem Anwenden eines Offsets von [99, 20]so festlegen, dass der Cursor auf der Schaltfläche platziert wird.

Wenn Sie zum Schluss auf die Schaltfläche klicken, wird die Figur gelöscht und alle Rückrufe werden automatisch freigegeben.

Bildbeschreibung hier eingeben

Suever
quelle
Könnten Sie bitte einen Link zum Testen dieses Codes bereitstellen? Ich habe keine Matlab-Software und dieser Code funktioniert nicht mit Octave (da er nur mit bestimmten Matlab-Codes kompatibel ist). Vielen Dank!
HyperNeutrino
3
@AlexL. Leider gibt es kein kostenloses Online-Dienstprogramm, mit dem gezeigt werden kann, wie dieser Code funktioniert. Selbst wenn dies der Fall wäre, werden die Steuerelemente der Benutzeroberfläche nicht in der Weboberfläche gerendert. Ich habe das GIF eingefügt, um die Funktionsweise des Codes zu demonstrieren.
Suever
In Ordung. Ich werde dann nicht testen. Gute Arbeit, habe eine +1.
HyperNeutrino
Einige Probleme unter Windows R2014a. Sie können das Dialogfeld wie folgt anhalten: 1. Bewegen Sie die Maus (zusammen mit dem Dialogfeld) in die Taskleiste (meine Taskleiste befindet sich auf der rechten Seite des Bildschirms), und das Dialogfeld hört auf, der Maus zu folgen. 2. Bewegen Sie die Maus so schnell, dass sich die Maus außerhalb des Dialogfelds in einem beliebigen Rahmen befindet. An diesem Punkt hört das Feld auf, der Maus zu folgen. Der Stil des Dialogfelds ist anscheinend auch von etwas anderem abhängig. Mit dem aktuellen Code fehlt meiner Maus kaum die OK-Taste, und ich muss 99 auf 120 ändern, um zu funktionieren. Wie auch immer, gute Arbeit!
Raserei Li
Das sehe ich aus meiner Perspektive. Meine Maus ist irgendwo in der Nähe dieses roten Fadenkreuzes.
Raserei Li
4

C # (Windows Form Application), 200 bis 114 Byte

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

Ungolfen

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

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

Alte 200-Byte-Lösung:

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

Ungolfen

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

Bildbeschreibung hier eingeben

Oliver
quelle
1
Gut gemacht! +1 :)
HyperNeutrino
1
Warten Sie ... also können Sie in C # einen Ereignis-Listener hinzufügen, indem Sie Folgendes tun Event += listener? Das ist großartig :-)
ETHproductions
@ETHproductions Könnte das wahrscheinlich auch in C ++ tun, wenn Sie den +Operator überladen . Immer noch sehr prägnant.
Carcigenicate
1

AutoHotkey, 122 115 Bytes

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

Demo

Kodos Johnson
quelle
2
Schön und einfach. Gut gemacht! +1
HyperNeutrino
1

Java 7, 294 289 286 264 220 Bytes

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 Bytes dank MouseInfo (von Zavada gestohlen ) Ich mag die awt-Bibliotheken nicht>.>

Ich habe 44 Bytes gespart, indem ich die Hauptmethode hier entfernt habe. Die Hauptmethode wird nicht benötigt, wenn diese als Applet gestartet wird. Dies kann über das "Run As Java Applet" von eclipse oder durch Deaktivieren des Sicherheitsmanagers und Verwenden des Appletviewer , der mit dem JDK geliefert wird , erreicht werden (es sei denn, Sie können Applets noch in Webbrowsern anzeigen. Ich glaube, Chrome lässt dies nicht zu). .

aufpoppen

Sack
quelle
Gute Arbeit, +1! Ich stimme zu, die AWT-Bibliotheken sind ein bisschen hässlich, aber es ist Golfspieler.
HyperNeutrino
Sie können 24 Bytes sparen, indem Sieimport java.awt.event.*;
Zavada
@Zavada Der *Platzhalter importiert keine Unterpakete rekursiv. Ich brauche java.awt.eventfür die MouseAdapterundMouseEvent
Poke
Entschuldigung, ich hatte einen absoluten Geistesblitz!
Zavada
1

Java, 172 199 235 Bytes

Golf gespielt:

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

Ungolfed:

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

    }
}

Erläuterung: Bei der Deklaration eines neuen JDialogs verwende ich die doppelte geschweifte Klammer. Dies sparte Bytes, indem die Erweiterung von JDialog ausgeschlossen wurde (so dass ich Bytes ohne publicfrom speichern kann main). In der anonymen Unterklasse von JDialog mache ich es sichtbar (mithilfe von 1>0anstelle von true) und rufe auf a(), was notwendig ist, da der Initalizer einen Fehler bei der Kompilierung aufweist, wenn die Schleife normal darin platziert war. Ich entschied mich für die Verwendung von MouseInfo anstelle des gesamten überschüssigen Codes für das Hinzufügen eines Maus-Listeners.

Bearbeiten: Musste die Anzahl um 27 erhöhen, um hinzuzufügen add(new java.awt.Button());. Ich dachte, JDialogs hätte aus technischen Gründen einen implizierten Knopf, aber ich scheine mich zu irren.

Bearbeiten 2: Die Mausposition musste hinzugefügt setSizeund verschoben werden, damit die Schaltfläche angeklickt werden kann.

Dialog

Zavada
quelle
Das funktioniert nicht ganz; Ich kann die Taste nicht drücken, da sich der Cursor ständig in der oberen linken Ecke des Fensters befindet. Bitte beheben Sie dies! :)
HyperNeutrino
Entschuldigung, sollte jetzt behoben sein!
Zavada
Ja. Funktioniert jetzt! +1
HyperNeutrino
Ich wusste / erinnere mich nicht, dass MouseInfo eine Sache war. Dies ist eine ordentliche Antwort.
Poke
1
@Poke Danke. Ich habe gesehen, wie Sie mit Applets geantwortet haben, und ich habe einen unzumutbaren Hass auf Applets. Deshalb fand ich, dass es niedlich wäre, es in Schwung zu bringen. Ihre Antwort ist aber nett :)
Zavada
0

Modified Processing Js 102 108 Bytes

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

Probieren Sie es online! Habe gerade meinen Link aktualisiert!

Es wird nur ein Rechteck gezeichnet, das Ihrer Maus folgt, und ein kleineres Rechteck, auf das Sie klicken, wird rot. Es funktioniert, ist aber nicht erstaunlich. Diese Version ist sehr streng auf Klammern und das alles :(

Christopher
quelle
Sie können die Klammern um Füllung entfernen
Kritixi Lithos
@KritixiLithos Ich kann eigentlich nicht :(
Christopher
Es ist eine streng typisierte Sprachversion
Christopher
Sie könnten dann eine andere Art der Verarbeitung verwenden, um Bytes zu speichern
Kritixi Lithos
@KritixiLithos eigentlich müsste ich dann auch eine bildschirmgröße einstellen und das würde bytes hinzufügen. (Randnotiz Ich wurde gerade aus dem Chat wegen "unangemessenen Inhalts geworfen, keine Ahnung warum? Es war auch ein Bot. Chat.stackexchange.com/messages/35631789/history was why
Christopher
0

Clojure, 525 Bytes

(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])

Erstellt keinen echten Windows-Dialog. Stattdessen wird eine gefälschte Schaltfläche erstellt und in der Mitte eine Dummy-Schaltfläche (nicht funktionsfähig) erstellt.

Dies wurde vom OP in den Kommentaren erlaubt.

Verwendet die Quil- Bibliothek.

(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]))

Gefälschter Dialog

Karzigenat
quelle
Ich bin versucht, dies nicht zu verbessern, weil Ihr Mitarbeiter 1000 ist und es so gut aussieht ... Ich zähle dies als gültige Lösung (einfach, weil ich bereits eine ähnliche Lösung validiert habe, die kein " reales "Fenster), also haben Sie eine +1. : P
HyperNeutrino
@HyperNeutrino Danke, auch wenn dies ein echter Overkill für die Aufgabe ist und eine gerade 1k Wiederholung nett ist. Ich hatte spaß damit Vielleicht erstelle ich zu Vergleichszwecken auch eine AWT-Version. Wird wohl halb so lang sein.
Carcigenicate
Du kannst nur auf 2k warten bis dahin! : D
HyperNeutrino
0

Mops / Slim + CSS / SCSS / WENIGER / Stylus + ES6 Javascript (98 Bytes)

Probieren Sie es online!

Mops (10 UTF-8 Bytes)

button#a X

Eingabestift (18 UTF-8 Bytes)

#a{position:fixed}

JS (70 UTF-8 Bytes)

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

Decompiled, Ungolfed und erklärtes Snippet:

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
quelle
0

Mathematica 226 Bytes

Die Mausposition relativ zum Bildschirm wird vom Frontend nachverfolgt, und die Fensterposition des Dialognotizbuchs wird bei jeder Mausbewegung verschoben. Ziemlich einfach, aber die Befehle sind in Bezug auf Buchstaben sehr lang, wie es bei Mathematica häufig der Fall ist. Klicken Sie auf OK, um den Dialog zu schließen.

{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 Wenn Sie mit dem Testen fertig sind, führen Sie dies aus, um die Front-End-Option zu entfernen.

SetOptions[$FrontEndSession,FrontEndEventActions->None]

Bildschirmanimation

Kelly Lowder
quelle
Können Sie ein GIF hinzufügen, um die Funktionalität zu beweisen? Ich kann Mathematica nicht testen. Vielen Dank!
HyperNeutrino
-1

Javascript (ES6) + HTML + CSS, 139 Byte

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

Da Sie Alert-Dialoge nicht positionieren können, habe ich meinen benutzerdefinierten, extravaganten Dialog in HTML erstellt. Das Javascript registriert eine Ereignisbehandlungsroutine für das Fensterobjekt und setzt die Position auf die Koordinaten des Ereignisses.

Versuchen Sie es online: https://jsfiddle.net/1yohswje/

corvus_192
quelle
Ich werde sagen, dass dies ungültig ist, weil es nichts Ähnliches wie ein legitimes "Fenster" erzeugt, und außerdem kann man nicht sagen, dass es ein Fenster mit einer Schaltfläche sein soll. Es ist jedoch eine interessante Lösung!
HyperNeutrino
@HyperNeutrino Ich habe meine Antwort aktualisiert. Was denkst du über dies?
corvus_192
In Ordnung. Das entspricht jetzt meinen Standards. Haben Sie ein +1
HyperNeutrino