Cajas de error de Windows al siguiente nivel

15

¿Conoces esos cuadros de Windows donde solo puedes hacer una cosa?

Cuadro de error de Windows: Continuar eliminará el contenido de su disco duro.  ¿Qué quieres hacer?  <Proceso> <Eliminar>

¡Llevemos esto al siguiente nivel!

Desafío

¡Crea un cuadro de diálogo con un botón que siga tu cursor a todas partes!

Especificaciones

No se puede tomar ninguna entrada. Puede haber salida a STDOUT o STDERR. Debe abrir una ventana con un botón (no se necesita texto, pero el texto puede estar contenido en el título de la ventana, el cuadro de diálogo o el botón). Se debe hacer clic en el botón y siempre debe seguir debajo del cursor para que solo se pueda hacer clic en él. Al hacer clic, puede hacer lo que desee, pero no haga que se bloquee una computadora porque voy a probar esto ... El cuadro de diálogo debe permanecer abierto mientras no se presione el botón, pero no es necesario que lo haga. cerrar cuando el botón está cerrado.

Suposiciones que puedes hacer

  • Puede suponer que el cursor permanecerá dentro del lienzo de dibujo.
  • Puede suponer que la ventana permanecerá enfocada, pero no debe desenfocarla mientras no se presione el botón.

Pseudocódigo de ejemplo

Aquí hay algunos pseudocódigo de ejemplo:

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

No se pueden proporcionar casos de prueba para este desafío

Este es un desafío de código de golf, por lo que gana la presentación válida más corta para el 14 de marzo (Día del Pi).

Hiperneutrino
fuente

Respuestas:

9

MATLAB, 86 63 bytes

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

Esta solución aprovecha la capacidad (generalmente molesta) de MATLAB de usar nombres de propiedad parciales siempre que la parte que se proporciona sea exclusiva solo de la propiedad de interés.

Esta solución utiliza la función integrada warndlgpara crear un cuadro de diálogo de advertencia con un botón "Aceptar". Esta función devuelve un figureidentificador que luego podemos usar para establecer la WindowButtonMotionFcndevolución de llamada (usando el nombre corto 'WindowButtonM').

La devolución de llamada que se evalúa cada vez que se mueve el cursor dentro de la ventana obtiene la posición actual del cursor (usando la PointerLocationpropiedad del objeto gráfico raíz , usando su nombre corto 'Po'). Luego actualizamos la Positionfigura usando moveguiy especificando la nueva ubicación de la figura después de aplicar un desplazamiento de [99, 20]para que el cursor se coloque en el botón.

Cuando finalmente se hace clic en el botón, la figura se elimina y todas las devoluciones de llamada se liberan automáticamente.

ingrese la descripción de la imagen aquí

Suever
fuente
¿Podría proporcionar un enlace para probar este código? No tengo el software Matlab, y este código no funciona con Octave (ya que solo es compatible con cierto código de Matlab). ¡Gracias!
HyperNeutrino
3
@AlexL. Desafortunadamente, no hay una utilidad en línea gratuita para mostrar cómo funciona este código. Incluso si lo hubiera, los controles de la interfaz de usuario no se representarán en la interfaz web. He incluido el GIF para demostrar que el código funciona.
Suever
Bien. No me molestaré en probar entonces. Buen trabajo, ten un +1.
HyperNeutrino
Un par de problemas en Windows R2014a. Puede evitar que el cuadro de diálogo siga: 1. Mueva el cuadro del mouse (junto con el cuadro de diálogo) a la barra de tareas (mi barra de tareas está en el lado derecho de la pantalla) y el cuadro de diálogo dejará de seguir al mouse; 2. Mueva el mouse lo suficientemente rápido como para que el mouse quede fuera del cuadro de diálogo en cualquier cuadro, momento en el cual el cuadro dejará de seguir al mouse. El estilo del cuadro de diálogo también aparentemente depende de otra cosa ... con el código actual, mi mouse apenas pierde el botón Aceptar y tengo que cambiar de 99 a 120 para que funcione. De todos modos, buen trabajo!
Frenesí Li
Esto es lo que veo desde mi perspectiva. Mi mouse está en algún lugar cerca de esa cruz roja.
Frenesí Li
4

C # (Solicitud Formulario Windows), 200 114 bytes

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

Sin golf

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

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

Antigua solución de 200 bytes:

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

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

ingrese la descripción de la imagen aquí

Oliver
fuente
1
¡Buen trabajo! +1 :)
HyperNeutrino
1
Espere ... así que en C #, puede agregar un detector de eventos haciendo Event += listener? Eso es increíble :-)
ETHproductions
@ETHproductions Probablemente podría hacer eso también en C ++ si sobrecargara el +operador. Aún muy sucinto.
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
}

Manifestación

Kodos Johnson
fuente
2
Agradable y simple ¡Buen trabajo! +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 gracias a MouseInfo (robado de Zavada ) No me gustan las bibliotecas awt>.>

Afeité 44 bytes eliminando el método principal aquí. El método principal no es necesario si se inicia como un applet. Esto se puede lograr a través de "Ejecutar como Java Applet" de eclipse o deshabilitando el administrador de seguridad y usando appletviewer , que viene con el JDK (a menos que aún pueda ver applets en navegadores web. No creo que Chrome lo permita) .

surgir

Dar un toque
fuente
Buen trabajo, +1! Estoy de acuerdo, las bibliotecas awt son un poco feas, pero es más golf.
HyperNeutrino
Puede guardar 24 bytes eliminandoimport java.awt.event.*;
Zavada
@Zavada El *comodín no importa subpaquetes de forma recursiva. Necesito java.awt.eventpara MouseAdapteryMouseEvent
Poke
Disculpas, ¡tuve un brainfart total!
Zavada
1

Java, 172 199 235 Bytes

Golfizado:

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

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

    }
}

Explicación: Utilizo la inicialización de doble llave en mi declaración de un nuevo JDialog. Esto ahorró bytes al excluir la extensión de JDialog (lo que me permite guardar bytes excluyendo publicde main). Dentro de la subclase anónima de JDialog, lo hago visible (usando en 1>0lugar de true) y call a(), lo cual es necesario porque el inicializador tiene un error en tiempo de compilación si el bucle se sentó en él normalmente. Opté por usar MouseInfo en lugar de todo el exceso de código asociado con la adición de un detector de mouse.

Editar: Tuve que aumentar el recuento en 27 para agregar add(new java.awt.Button());. Pensé que JDialogs tenía un botón implícito por tecnicismo, pero parece estar equivocado.

Edición 2: Tuve que agregar setSizey compensar la ubicación del mouse para hacer clic en el botón.

Diálogo

Zavada
fuente
Esto no funciona del todo; No puedo presionar el botón porque el cursor está constantemente en la esquina superior izquierda de la ventana. Por favor arregla esto! :)
HyperNeutrino
Disculpas, se deben arreglar ahora!
Zavada
Sí. Funciona ahora! +1
HyperNeutrino
No sabía / recuerdo que MouseInfo era una cosa. Esta es una buena respuesta.
Poke
1
@Poke Gracias. Vi tu respuesta usando applets, y tengo un odio irracional por los applets, así que sentí que sería lindo hacerlo en swing. Su respuesta es buena :) :)
Zavada
0

Modificados Procesamiento Js 102 108 bytes

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

Pruébalo en línea! Acabo de actualizar mi enlace!

Simplemente dibuja un rectángulo que sigue a su mouse y un rectángulo más pequeño dentro del que hace clic y se vuelve rojo. Funciona pero no es asombroso. Esta versión es muy estricta en llaves y todo eso :(

Christopher
fuente
Puede quitar las llaves alrededor del relleno
Kritixi Lithos
@KritixiLithos Realmente no puedo :(
Christopher
Es una versión estrictamente de lenguaje tipográfico
Christopher
Entonces podría usar otro tipo de procesamiento para guardar bytes
Kritixi Lithos
@KritixiLithos en realidad, entonces también tendría que configurar un tamaño de pantalla y eso agregaría bytes. (Nota al margen me acaban de echar del chat por "contenido inapropiado, ¿alguna idea de por qué? También fue un bot. Chat.stackexchange.com/messages/35631789/history fue el motivo
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])

No no crear un diálogo de Windows original. En su lugar, crea uno falso y crea un botón ficticio (que no funciona) en el medio.

Esto fue permitido por el OP en los comentarios.

Utiliza la biblioteca 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]))

Diálogo falso

Carcigenicate
fuente
Estoy tentado a no votar esto porque tu representante es 1000 y se ve muy bien ... Voy a contar esto como una solución válida (simplemente porque ya he validado una solución similar que no crea un " real "), así que tenga un +1. : P
HyperNeutrino
@HyperNeutrino Gracias, a pesar de que esto es una exageración excesiva para la tarea, e incluso un representante de 1k es bueno. ¡Me divertí con eso! Tal vez crearé una versión AWT también solo para comparar. Probablemente será como la mitad de la longitud.
Carcigenicate
¡Solo puedes esperar 2k para entonces! : D
HyperNeutrino
0

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

Pruébalo en línea!

Pug (10 bytes UTF-8)

button#a X

Stylus (18 bytes UTF-8)

#a{position:fixed}

JS (70 bytes UTF-8)

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

Descompilado, Ungolfed y explicó 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
fuente
0

Mathematica 226 Bytes

La posición del mouse relativa a la pantalla es rastreada por el extremo frontal y la posición de la ventana del cuaderno de diálogo se mueve cada vez que se mueve el mouse. Bastante simple, pero los comandos son muy largos en términos de letras, como suele ser el caso con Mathematica. Al hacer clic en Aceptar, se cerrará el cuadro de diálogo.

{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];

PD Cuando hayas terminado de probar, ejecuta esto para eliminar la opción de front-end.

SetOptions[$FrontEndSession,FrontEndEventActions->None]

animación de pantalla

Kelly Lowder
fuente
¿Puedes agregar un gif para probar la funcionalidad? No puedo probar Mathematica. ¡Gracias!
HyperNeutrino
-1

Javascript (ES6) + HTML + CSS, 139 bytes

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

Como no puede ubicar cuadros de diálogo de alerta, hice mi cuadro de diálogo súper elegante personalizado en HTML. El javascript registra un controlador de eventos en el objeto de la ventana y establece la posición en las coordenadas del evento.

Pruébelo en línea: https://jsfiddle.net/1yohswje/

corvus_192
fuente
Voy a decir que esto no es válido, porque no crea nada similar a una "ventana" legítima y, además, no se puede decir que debe ser una ventana con un botón. ¡Sin embargo, es una solución interesante!
HyperNeutrino
@HyperNeutrino He actualizado mi respuesta. ¿Qué piensas de esto?
corvus_192
Okay. Eso cumple con mis estándares ahora. Tener un +1
HyperNeutrino