Scatole di errore di Windows al livello successivo


15

Sai quelle scatole di Windows in cui puoi fare solo una cosa?

Casella di errore di Windows: la procedura eliminerà il contenuto del disco rigido.  Che cosa vuoi fare?  <Procedi> <Elimina>

Portiamo questo al livello successivo!

Sfida

Crea una finestra di dialogo con un pulsante che segua il tuo cursore ovunque!

Specifiche

Nessun input può essere preso. Potrebbe esserci un output su STDOUT o STDERR. È necessario aprire una finestra con un pulsante (non è necessario alcun testo, ma il testo può essere contenuto nel titolo della finestra, nella finestra di dialogo o nel pulsante). Il pulsante deve essere selezionabile e deve sempre seguire il cursore in modo da poterlo fare solo clic. Facendo clic, può fare tutto ciò che vuoi, ma per favore non farlo arrestare in modo anomalo su un computer perché lo testerò ... La finestra di dialogo deve rimanere aperta fino a quando il pulsante non viene premuto, ma non è necessario chiudere quando il pulsante è chiuso.

Ipotesi che puoi fare

  • Si può presumere che il cursore rimarrà all'interno dell'area di disegno.
  • Si può presumere che la finestra rimarrà a fuoco, ma non si deve mettere a fuoco la finestra fino a quando il pulsante non viene premuto.

Esempio di pseudocodice

Ecco alcuni pseudocodici di esempio:

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

Non è possibile fornire casi di test per questa sfida

Questa è una sfida di code-golf, quindi vince l'invio valido più breve entro il 14 marzo (Pi Day)!

Risposte:


9

MATLAB, 86 63 byte

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

Questa soluzione sfrutta la capacità (tipicamente fastidiosa) di MATLAB di utilizzare nomi di proprietà parziali purché la parte fornita sia unica solo per la proprietà di interesse.

Questa soluzione utilizza l'integrato warndlgper creare una finestra di avviso con un pulsante "OK". Questa funzione restituisce un figurehandle che possiamo quindi utilizzare per impostare il WindowButtonMotionFcncallback (usando il nome breve 'WindowButtonM').

Il callback che viene valutato ogni volta che si sposta il cursore all'interno della finestra ottiene la posizione corrente del cursore (usando la PointerLocationproprietà dell'oggetto grafico radice , usando il suo nome breve 'Po'). Aggiorniamo quindi Positionla figura usando moveguie specificando la nuova posizione della figura dopo aver applicato un offset di in [99, 20]modo che il cursore sia posizionato sul pulsante.

Quando si fa infine clic sul pulsante, la figura viene eliminata e tutti i callback vengono automaticamente rilasciati.

inserisci qui la descrizione dell'immagine


Potresti fornire un link per testare questo codice? Non ho il software Matlab e questo codice non funziona con Octave (poiché è compatibile solo con un determinato codice Matlab). Grazie!
HyperNeutrino,

3
@AlexL. Sfortunatamente non esiste un'utilità online gratuita per mostrare come funziona questo codice. Anche se ci fossero, i controlli dell'interfaccia utente non saranno resi nell'interfaccia web. Ho incluso la GIF per dimostrare il funzionamento del codice.
Suever,

Tutto a posto. Allora non mi preoccuperò dei test. Ottimo lavoro, fai +1.
HyperNeutrino,

Un paio di problemi su Windows R2014a. È possibile interrompere la seguente finestra di dialogo: 1. Spostando il mouse (insieme alla finestra di dialogo) sulla barra delle applicazioni (la mia barra delle applicazioni si trova sul lato destro dello schermo) e la finestra di dialogo smetterà di seguire il mouse; 2. Spostando il mouse abbastanza velocemente in modo tale che il mouse si trovi all'esterno della finestra di dialogo in qualsiasi fotogramma, a quel punto la casella smetterà di seguire il mouse. Lo stile della finestra di dialogo sembra anche dipendere da qualcos'altro ... con il codice corrente, il mio mouse manca a malapena il pulsante OK e devo cambiare da 99 a 120 per funzionare. Comunque, buon lavoro!
Frenzy Li,

Questo è ciò che vedo dal mio punto di vista. Il mio topo è da qualche parte vicino a quel mirino rosso.
Frenzy Li,

4

C # (applicazione Windows Form), 200 114 byte

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

Un-golfed

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

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

Vecchia soluzione a 200 byte:

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

Un-golfed

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

inserisci qui la descrizione dell'immagine


1
Buon lavoro! +1 :)
HyperNeutrino,

1
Aspetta .... quindi in C #, puoi aggiungere un listener di eventi facendo Event += listener? È fantastico :-)
ETHproductions

@ETHproductions Probabilmente potrebbe farlo anche in C ++ se hai sovraccaricato l' +operatore. Ancora molto conciso.
Carcigenicato il

1

Tasto di scelta automatica, 122 115 byte

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

dimostrazione


2
Bello e semplice. Buon lavoro! +1
HyperNeutrino

1

Java 7, 294 289 286 264 220 byte

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 byte grazie a MouseInfo (rubato a Zavada ) Non mi piacciono le librerie awt>.>

Ho rasato 44 byte rimuovendo il metodo principale qui. Il metodo principale non è necessario se viene avviato come applet. Ciò può essere ottenuto tramite "Esegui come applet Java" di eclipse o disabilitando il gestore della sicurezza e utilizzando appletviewer , fornito con JDK (a meno che non sia ancora possibile visualizzare le applet nei browser Web. Non credo che Chrome lo consenta) .

apparire


Bel lavoro, +1! Sono d'accordo, le librerie awt sono un po 'brutte, ma è più golfista.
HyperNeutrino,

È possibile salvare 24 byte rimuovendoimport java.awt.event.*;
Zavada

@Zavada Il *carattere jolly non importa ricorsivamente pacchetti secondari . Ho bisogno java.awt.eventdi MouseAdaptereMouseEvent
Poke il

Mi scuso, ho avuto un brainfart totale!
Zavada,

1

Java, 172 199 235 byte

golfed:

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

    }
}

Spiegazione: Uso l'inizializzazione a doppia parentesi sulla mia dichiarazione di un nuovo JDialog. Questo ha salvato i byte escludendo l'estensione di JDialog (permettendomi di salvare i byte esclusi publicda main). All'interno della sottoclasse anonima di JDialog lo rendo visibile (usando 1>0invece di true) e chiamo a(), il che è necessario perché l'inizializzatore ha un errore di compilazione se il ciclo era normalmente inserito in esso. Ho scelto di utilizzare MouseInfo piuttosto che tutto il codice in eccesso associato all'aggiunta di un listener per mouse.

Modifica: ho dovuto aumentare il conteggio di 27 per aggiungere add(new java.awt.Button());. Pensavo che JDialogs avesse un pulsante implicito per tecnicità, ma mi sembra di sbagliarmi.

Modifica 2: ho dovuto aggiungere setSizee spostare la posizione del mouse per rendere il pulsante selezionabile.

Dialogo


Questo non funziona del tutto; Non riesco a premere il pulsante perché il cursore si trova costantemente nell'angolo in alto a sinistra della finestra. Per favore, aggiusta questo! :)
HyperNeutrino il

Scuse, ora dovrebbe essere risolto!
Zavada,

Sì. Funziona ora! +1
HyperNeutrino,

Non sapevo / ricordo MouseInfo era una cosa. Questa è una risposta chiara.
Colpisci il

1
@Poke Grazie. Ho visto la tua risposta usando le applet e ho un odio irragionevole per le applet, quindi ho pensato che sarebbe stato carino farlo in altalena. La tua risposta è buona però :)
Zavada,

0

Elaborazione modificata Js 102 108 byte

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

Provalo online! Ho appena aggiornato il mio link!

Disegna semplicemente un rettangolo che segue il mouse e un rettangolo più piccolo all'interno di esso che fai clic e diventa rosso. Funziona ma non è sorprendente. Questa versione è molto severa per le parentesi graffe e tutto il resto :(


Puoi rimuovere le parentesi graffe attorno al riempimento
Kritixi Lithos,

@KritixiLithos In realtà non posso :(
Christopher

È una versione in linguaggio rigorosamente di tipo
Christopher,

Quindi è possibile utilizzare un altro tipo di elaborazione per salvare byte
Kritixi Lithos,

@KritixiLithos in realtà allora dovrei anche impostare una dimensione dello schermo e che aggiungerebbe byte. (Nota a margine che sono appena stato cacciato dalla chat per "contenuti inappropriati qualsiasi idea del perché? Era anche un bot. Chat.stackexchange.com/messages/35631789/history era il motivo
Christopher

0

Clojure, 525 byte

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

Non non creare una finestra di Windows originale. Invece, ne costruisce uno falso e crea un pulsante fittizio (non funzionante) nel mezzo.

Ciò è stato consentito dall'OP nei commenti.

Utilizza la libreria 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]))

Finta finestra di dialogo


Sono tentato di non votare questo perché il tuo rappresentante è 1000 e sembra così bello ... lo considero una soluzione valida (semplicemente perché ho già convalidato una soluzione simile che non crea un " vera "finestra), quindi prendi un +1. : P
HyperNeutrino,

@HyperNeutrino Grazie, anche se questo è un grosso problema per l'attività, e anche un rappresentante di 1k è carino. Mi sono divertito! Forse creerò una versione AWT anche solo per confronto. Probabilmente sarà come metà della lunghezza.
Carcigenicate il

Puoi solo aspettare 2k per allora! : D
HyperNeutrino,

0

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

Provalo online!

Pug (10 byte UTF-8)

button#a X

Stilo (18 UTF-8 byte)

#a{position:fixed}

JS (70 UTF-8 byte)

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

Snippet decompilato, non golfato e spiegato:

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>


0

Mathematica 226 byte

La posizione del mouse rispetto allo schermo viene tracciata dalla parte frontale e la posizione della finestra del blocco note di dialogo viene spostata ogni volta che si sposta il mouse. Abbastanza semplice, ma i comandi sono molto lunghi in termini di lettere, come spesso accade con Mathematica. Facendo clic su OK si chiuderà la finestra di dialogo.

{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 Al termine del test, esegui questo per rimuovere l'opzione front-end.

SetOptions[$FrontEndSession,FrontEndEventActions->None]

animazione dello schermo


Puoi aggiungere un GIF per dimostrare la funzionalità? Non riesco a testare Mathematica. Grazie!
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'}}

Dal momento che non puoi posizionare le finestre di avviso, ho creato la mia finestra di dialogo personalizzata super fantasia in HTML. Il javascript registra un gestore eventi sull'oggetto finestra e imposta la posizione sulle coordinate dell'evento.

Provalo online: https://jsfiddle.net/1yohswje/


Sto per dire che questo non è valido, perché non crea nulla di simile a una "finestra" legittima e, inoltre, non si può dire che debba essere una finestra con un pulsante. Tuttavia, è una soluzione interessante!
HyperNeutrino,

@HyperNeutrino Ho aggiornato la mia risposta. Cosa ne pensi di questo?
corvus_192,

Ok. Questo è conforme ai miei standard ora.
Prendi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.