Caixas de erro do Windows para o próximo nível

15

Você conhece aquelas caixas do Windows em que você só pode fazer uma coisa?

Caixa de erro do Windows: O processo excluirá o conteúdo do seu disco rígido.  O que você quer fazer?  <Proceder> <Excluir>

Vamos levar isso para o próximo nível!

Desafio

Faça uma caixa de diálogo com um botão que segue o cursor em todos os lugares!

Especificações

Nenhuma entrada pode ser recebida. Pode haver saída para STDOUT ou STDERR. Você deve abrir uma janela com um botão (nenhum texto é necessário, mas o texto pode estar contido no título da janela, na caixa de diálogo ou no botão). O botão deve ser clicável e sempre deve seguir o cursor para que você possa clicar apenas nele. Ao clicar, ele pode fazer o que você quiser, mas não deixe o computador travar, porque testarei isso ... A caixa de diálogo deve permanecer aberta enquanto o botão não for pressionado, mas não será necessário. feche quando o botão estiver fechado.

Suposições que você pode fazer

  • Você pode assumir que o cursor permanecerá dentro da tela de desenho.
  • Você pode presumir que a janela permanecerá focada, mas não deve colocá-la fora de foco enquanto o botão não for pressionado.

Exemplo de pseudocódigo

Aqui está um exemplo de pseudocódigo:

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

Casos de teste não podem ser fornecidos para este desafio

Esse é um desafio de código-golfe, portanto, o menor envio válido até 14 de março (dia do Pi) vence!

HyperNeutrino
fonte

Respostas:

9

MATLAB, 86 63 bytes

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

Essa solução aproveita a capacidade do MATLAB (normalmente irritante) de usar nomes parciais de propriedades, desde que a peça fornecida seja exclusiva apenas da propriedade de seu interesse.

Esta solução usa o built-in warndlgpara criar uma caixa de diálogo de aviso com um botão "OK". Essa função retorna um figureidentificador que podemos usar para definir o WindowButtonMotionFcnretorno de chamada (usando o nome abreviado 'WindowButtonM').

O retorno de chamada que é avaliado sempre que o cursor é movido dentro da janela obtém a posição atual do cursor (usando a PointerLocationpropriedade do objeto gráfico raiz , usando o nome abreviado 'Po'). Em seguida, atualizamos a Positionfigura usando moveguie especificando o novo local da figura após aplicar um deslocamento de [99, 20]modo que o cursor seja colocado no botão.

Quando o botão é finalmente clicado, a figura é excluída e todos os retornos de chamada são liberados automaticamente.

insira a descrição da imagem aqui

Suever
fonte
Você poderia fornecer um link para testar esse código? Eu não tenho o software Matlab, e esse código não funciona com o Octave (já que é compatível apenas com determinados códigos do Matlab). Obrigado!
HyperNeutrino 23/02
3
@AlexL. Infelizmente, não há utilitário online gratuito para mostrar como esse código funciona. Mesmo se houver, os controles da interface do usuário não serão renderizados na interface da web. Eu incluí o GIF para demonstrar o funcionamento do código.
Suever 23/02
Bem. Não vou me incomodar em testar então. Bom trabalho, tenha um +1.
HyperNeutrino 23/02
Alguns problemas no Windows R2014a. Você pode interromper a caixa de diálogo do seguinte modo: 1. Movendo a caixa do mouse (junto com a caixa de diálogo) para a barra de tarefas (minha barra de tarefas fica no lado direito da tela) e a caixa de diálogo para de seguir o mouse; 2. Mova o mouse rápido o suficiente para que ele fique fora da caixa de diálogo em qualquer quadro; nesse momento, a caixa irá parar de seguir o mouse. O estilo da caixa de diálogo também é aparentemente dependente de outra coisa ... com o código atual, meu mouse mal perde o botão OK e tenho que mudar de 99 para 120 para funcionar. Enfim, bom trabalho!
Frenzy Li
Isso é o que eu vejo na minha perspectiva. Meu mouse está em algum lugar perto daquela mira vermelha.
Frenzy Li
4

C # (aplicativo Windows Form), 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);};}

Un-Golfed

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

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

Solução antiga 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);}}

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

insira a descrição da imagem aqui

Oliver
fonte
1
Bom trabalho! +1 :)
HyperNeutrino 23/02
1
Espere ... então, em C #, você pode adicionar um ouvinte de evento fazendo isso Event += listener? Isso é incrível :-) #
687 ETHproductions
@ETHproductions Provavelmente também poderia fazer isso em C ++ se você sobrecarregasse o +operador. Ainda muito 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
}

Demo

Kodos Johnson
fonte
2
Agradável e simples. Bom trabalho! +1
HyperNeutrino 24/02
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 graças ao MouseInfo (roubado do Zavada ) Eu não gosto das bibliotecas awt>.>

Raspei 44 bytes removendo o método principal aqui. O método principal não é necessário se for iniciado como um applet. Isso pode ser alcançado através do "Run As Java Applet" do eclipse ou desativando o gerenciador de segurança e usando o appletviewer , que acompanha o JDK (a menos que você ainda consiga visualizar os applets nos navegadores da Web. Não acho que o Chrome permita isso) .

Aparecer

Cutucar
fonte
Bom trabalho, +1! Eu concordo, as bibliotecas awt são um pouco feias, mas é mais golfista.
HyperNeutrino
Você pode salvar 24 bytes removendoimport java.awt.event.*;
Zavada
@ Zavada O *curinga não importa recursivamente subpacotes. Eu preciso java.awt.eventpara o MouseAdaptereMouseEvent
Puxar
Desculpas, eu tive um total peido cerebral!
Zavada
1

Java, 172 199 235 bytes

Golfe:

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

    }
}

Explicação: Uso a inicialização entre chaves na minha declaração de um novo JDialog. Isso salvou bytes excluindo a extensão do JDialog (permitindo salvar bytes excluindo publicde main). Dentro da subclasse anônima do JDialog, eu o mostro (usando em 1>0vez de true) e chamo a(), o que é necessário porque o initalizador apresenta um erro em tempo de compilação se o loop estiver normalmente nele. Optei por usar o MouseInfo em vez de todo o excesso de código associado à adição de um ouvinte de mouse.

Editar: teve que aumentar a contagem em 27 para adicionar add(new java.awt.Button());. Eu pensei que o JDialogs tinha um botão implícito pelo tecnicismo, mas eu pareço estar errado.

Editar 2: teve que adicionar setSizee deslocar a localização do mouse para tornar o botão clicável.

Diálogo

Zavada
fonte
Isso não funciona bem; Não consigo pressionar o botão porque o cursor está constantemente no canto superior esquerdo da janela. Corrija isso! :)
HyperNeutrino 25/02
Desculpas, deve ser corrigido agora!
Zavada
Sim. Funciona agora! +1
HyperNeutrino
Eu não sabia / lembrava que MouseInfo era uma coisa. Esta é uma resposta clara.
Puxa
1
@ Poké Obrigado. Vi sua resposta usando miniaplicativos, e tenho um ódio irracional por miniaplicativos, então achei que seria fofo fazer isso no balanço. A sua resposta é agradável embora :)
Zavada
0

Processamento Modificado Js 102 108 bytes

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

Experimente online! Acabei de atualizar meu link!

Apenas desenha um retângulo que segue o mouse e um retângulo menor dentro do qual você clica e fica vermelho. Funciona, mas não é incrível. Esta versão é muito rigorosa entre chaves e tudo isso :(

Christopher
fonte
Você pode remover os aparelhos ao redor do preenchimento
Kritixi Lithos
@KritixiLithos Eu realmente não posso :(
Christopher
É uma versão de idioma estritamente tipo
Christopher
Você poderia usar outro tipo de processamento para salvar os bytes então
Kritixi Lithos
@KritixiLithos, na verdade, eu também teria que configurar um tamanho de tela e isso adicionaria bytes. (Observação: acabei de ser expulso do chat por "conteúdo inapropriado, alguma idéia do porquê? Também era um bot. Chat.stackexchange.com/messages/35631789/history era o 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])

Faz não criar um diálogo de Windows genuíno. Em vez disso, ele cria um falso e cria um botão fictício (inoperante) no meio.

Isso foi permitido pelo OP nos comentários.

Usa a 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

Carcinigenicado
fonte
Estou tentado a não aprovar isso porque seu representante é 1000 e parece ótimo ... Vou contar isso como uma solução válida (simplesmente porque já validei uma solução semelhante que não cria um " real "), então marque um +1. : P
HyperNeutrino
@HyperNeutrino Obrigado, mesmo que isso seja um exagero total para a tarefa, e um representante de até 1k é bom. Eu me diverti com isso! Talvez eu crie uma versão AWT também apenas para comparação. Provavelmente terá metade do comprimento.
Carcigenicate
Você pode apenas esperar 2k para então! : D
HyperNeutrino 27/02
0

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

Experimente online!

Pug (10 bytes UTF-8)

button#a X

Caneta (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 e explicou o 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
fonte
0

Mathematica 226 Bytes

A posição do mouse em relação à tela é rastreada pelo front end e a posição da janela do bloco de diálogo é movida sempre que o mouse se move. Muito simples, mas os comandos são muito longos em termos de letras, como costuma acontecer no Mathematica. Clicar em OK fechará a caixa 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];

PS Ao concluir o teste, execute isso para remover a opção de front-end.

SetOptions[$FrontEndSession,FrontEndEventActions->None]

animação de tela

Kelly Lowder
fonte
Você pode adicionar um gif para provar a funcionalidade? Não posso testar o Mathematica. Obrigado!
HyperNeutrino 23/02
-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 você não pode posicionar as caixas de diálogo de alerta, criei minha caixa de diálogo super sofisticada em HTML. O javascript registra um manipulador de eventos no objeto de janela e define a posição para as coordenadas do evento.

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

corvus_192
fonte
Eu vou dizer que isso é inválido, porque não cria nada parecido com uma "janela" legítima e, também, você não pode dizer que é para ser uma janela com um botão. No entanto, é uma solução interessante!
HyperNeutrino 26/02
@HyperNeutrino Atualizei minha resposta. O que você acha disso?
Corvus_192
Está bem. Isso está de acordo com meus padrões agora. Tenha +1
HyperNeutrino