Windows Error Boxes do następnego poziomu

15

Znasz te skrzynki systemu Windows, w których możesz zrobić tylko jedną rzecz?

Windows Error Box: Kontynuacja spowoduje usunięcie zawartości dysku twardego.  Co chcesz robić?  <Postęp> <Usuń>

Przejdźmy do następnego poziomu!

Wyzwanie

Utwórz okno dialogowe z przyciskiem, który podąża za kursorem wszędzie!

Okular

Nie można pobierać żadnych danych wejściowych. Może istnieć wyjście do STDOUT lub STDERR. Musisz otworzyć okno za pomocą jednego przycisku (tekst nie jest konieczny, ale tekst może być zawarty w tytule okna, oknie dialogowym lub przycisku). Przycisk musi być klikalny i musi zawsze podążać za kursorem, aby można go było tylko kliknąć. Po kliknięciu może zrobić wszystko, co chcesz, ale nie powoduj awarii komputera, ponieważ będę to testować ... Okno dialogowe musi pozostać otwarte, dopóki przycisk nie zostanie naciśnięty, ale nie musi zamknij, gdy przycisk jest zamknięty.

Założenia, które możesz zrobić

  • Możesz założyć, że kursor pozostanie w obszarze roboczym rysunku.
  • Możesz założyć, że okno pozostanie aktywne, ale nie wolno wyłączać go, dopóki przycisk nie zostanie naciśnięty.

Przykład pseudokodu

Oto przykładowy pseudokod:

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

W tym wyzwaniu nie można zapewnić przypadków testowych

Jest to wyzwanie dla golfa, więc wygrywa najkrótszy ważny zgłoszenie do 14 marca (Dzień Pi)!

HyperNeutrino
źródło

Odpowiedzi:

9

MATLAB, 86 63 bajtów

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

To rozwiązanie wykorzystuje zdolność MATLAB (zwykle irytującą) do używania częściowych nazw właściwości, pod warunkiem, że dostarczona część jest unikalna tylko dla właściwości będących przedmiotem zainteresowania.

To rozwiązanie wykorzystuje wbudowane narzędzie warndlgdo utworzenia okna dialogowego z ostrzeżeniem z przyciskiem „OK”. Ta funkcja zwraca figureuchwyt, którego możemy następnie użyć do ustawienia WindowButtonMotionFcnwywołania zwrotnego (używając krótkiej nazwy 'WindowButtonM').

Oddzwanianie, które jest oceniane za każdym razem, gdy kursor jest przesuwany w oknie, pobiera bieżącą pozycję kursora (przy użyciu PointerLocationwłaściwości głównego obiektu graficznego , przy użyciu jego krótkiej nazwy 'Po'). Następnie aktualizujemy Positionrysunek za pomocą moveguii określając nowe położenie rysunku po zastosowaniu przesunięcia, [99, 20]tak aby kursor został umieszczony na przycisku.

Po ostatecznym kliknięciu przycisku rysunek jest usuwany, a wszystkie wywołania zwrotne są automatycznie zwalniane.

enter image description here

Suever
źródło
Czy możesz podać link do przetestowania tego kodu? Nie mam oprogramowania Matlab, a ten kod nie działa z Octave (ponieważ jest zgodny tylko z pewnym kodem Matlab). Dzięki!
HyperNeutrino
3
@AlexL. Niestety nie ma bezpłatnego narzędzia online do pokazania, jak działa ten kod. Nawet gdyby tak było, formanty interfejsu użytkownika nie będą renderowane w interfejsie internetowym. Dołączyłem GIF, aby zademonstrować działanie kodu.
Suever
W porządku. Nie zawracam sobie głowy testowaniem. Dobra robota, masz +1.
HyperNeutrino
Kilka problemów w systemie Windows R2014a. Możesz zatrzymać okno dialogowe, wykonując następujące czynności: 1. Przeniesienie myszy (wraz z oknem dialogowym) na pasek zadań (mój pasek zadań znajduje się po prawej stronie ekranu), a okno dialogowe przestanie podążać za myszą; 2. Poruszanie myszką wystarczająco szybko, aby mysz znajdowała się poza oknem dialogowym w dowolnej ramce, w którym to momencie ramka przestanie podążać za myszą. Styl okna dialogowego jest również najwyraźniej zależny od czegoś innego ... przy obecnym kodzie moja mysz prawie nie omija przycisku OK i muszę zmienić 99 na 120, aby działać. W każdym razie, dobra robota!
Frenzy Li
To właśnie widzę z mojej perspektywy. Moja mysz jest gdzieś w pobliżu tego czerwonego celownika.
Frenzy Li
4

C # (Windows Form Application), 200 114 bajtów

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

Bez golfa

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

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

Stare 200-bajtowe rozwiązanie:

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

Bez golfa

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

enter image description here

Oliver
źródło
1
Dobra robota! +1 :)
HyperNeutrino
1
Poczekaj .... więc w C # możesz dodać detektor zdarzeń, wykonując Event += listener? To niesamowite :-)
ETHproductions
@ETHproductions Prawdopodobnie mógłby to zrobić również w C ++, jeśli przeciążono +operatora. Wciąż bardzo zwięzły.
Carcigenicate
1

AutoHotkey, 122 115 bajtów

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
źródło
2
Ładne i proste. Dobra robota! +1
HyperNeutrino
1

Java 7, 294 289 286 264 220 bajtów

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 bajty dzięki MouseInfo (skradzione z Zavady ) Nie lubię bibliotek awt>.>

Ogoliłem 44 bajty, usuwając tutaj główną metodę. Główna metoda nie jest potrzebna, jeśli jest uruchamiana jako aplet. Można to osiągnąć za pomocą „Run As Java Applet” środowiska Eclipse lub przez wyłączenie menedżera bezpieczeństwa i użycie appletviewer , który jest dostarczany z JDK (chyba że nadal możesz przeglądać aplety w przeglądarkach internetowych. Nie sądzę, że chrome na to pozwala) .

popup

Szturchać
źródło
Dobra robota, +1! Zgadzam się, biblioteki awt są trochę brzydkie, ale są bardziej golfowe.
HyperNeutrino
Możesz zaoszczędzić 24 bajty, usuwającimport java.awt.event.*;
Zavada
@Zavada Symbol *wieloznaczny nie importuje rekursywnie podpakietów. Muszę java.awt.eventdla MouseAdapteriMouseEvent
Poke
Przepraszam, miałem totalny pierdolony mózg!
Zavada,
1

Java, 172 199 235 bajtów

Gra w golfa:

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

Nie golfowany:

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

    }
}

Objaśnienie: Korzystam z inicjalizacji podwójnego nawiasu klamrowego w deklaracji nowego JDialog. To zapisało bajty, wykluczając rozszerzenie JDialog (pozwalając mi zapisywać bajty wykluczając publicz main). W anonimowej podklasie JDialoga sprawiam, że jest ona widoczna (używa 1>0zamiast true) i wywołuje a(), co jest konieczne, ponieważ inicjalizator ma błąd czasu kompilacji, jeśli pętla była w nim normalnie umieszczona. Zdecydowałem się użyć MouseInfo zamiast całego nadmiaru kodu związanego z dodawaniem detektora myszy.

Edycja: Musiał zwiększyć liczbę o 27, aby dodać add(new java.awt.Button()); . Myślałem, że JDialogs ma domyślny przycisk ze względów technicznych, ale wydaje mi się, że się mylę.

Edycja 2: Musiałem dodać setSizei przesunąć położenie myszy, aby przycisk można było kliknąć.

Dialog

Zavada
źródło
To nie do końca działa; Nie mogę nacisnąć przycisku, ponieważ kursor stale znajduje się w lewym górnym rogu okna. Proszę to naprawić! :)
HyperNeutrino,
Przepraszam, należy to teraz naprawić!
Zavada,
Tak. Działa teraz! +1
HyperNeutrino
Nie wiedziałem / nie pamiętałem, że MouseInfo to była rzecz. To fajna odpowiedź.
Poke
1
@Poke Thanks. Widziałem twoją odpowiedź za pomocą apletów i mam nieuzasadnioną nienawiść do apletów, więc czułem, że fajnie byłoby robić to na huśtawce. Twoja odpowiedź jest miła :)
Zavada
0

Zmodyfikowane przetwarzanie Js 102 108 bajtów

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

Wypróbuj online! Właśnie zaktualizowałem mój link!

Po prostu rysuje prostokąt, który podąża za myszą, i klikniesz w nim mniejszy prostokąt, który zmienia kolor na czerwony. Działa, ale nie jest niesamowity. Ta wersja jest bardzo surowa na aparatach ortodontycznych i tak dalej :(

Krzysztof
źródło
Możesz usunąć szelki wokół wypełnienia
Kritixi Lithos
@KritixiLithos Właściwie nie mogę :(
Christopher
Jest to ściśle językowa wersja językowa
Christopher
Możesz wtedy użyć innego rodzaju przetwarzania, aby zapisać bajty
Kritixi Lithos
@KritixiLithos faktycznie wtedy musiałbym również ustawić rozmiar ekranu i to dodałoby bajty. (Notka poboczna Właśnie wyrzucono mnie z czatu za „nieodpowiednią treść jakiś pomysł dlaczego? To też był bot. Chat.stackexchange.com/messages/35631789/history było dlaczego
Christopher
0

Clojure, 525 bajtów

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

Czy nie stworzyć prawdziwy dialog Windows. Zamiast tego buduje fałszywy i tworzy na środku atrapę (niedziałający) przycisk.

Było to dozwolone przez PO w komentarzach.

Korzysta z biblioteki 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]))

Fałszywy dialog

Carcigenicate
źródło
Kusi mnie, aby nie głosować za tym, ponieważ twój przedstawiciel ma 1000 i wygląda to tak ładnie ... Będę liczyć to jako prawidłowe rozwiązanie (po prostu dlatego, że sprawdziłem już podobne rozwiązanie, które nie tworzy „ prawdziwe ”okno), więc daj +1. : P
HyperNeutrino
@HyperNeutrino Dzięki, mimo że jest to rażąca nadmiar zadania, a nawet 1 000 przedstawicieli jest fajne. Dobrze się z tym bawiłem! Może utworzę też wersję AWT tylko dla porównania. Prawdopodobnie będzie to połowa długości.
Carcigenicate
Możesz wtedy poczekać na 2k! : D
HyperNeutrino
0

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

Wypróbuj online!

Mops (10 bajtów UTF-8)

button#a X

Rysik (18 bajtów UTF-8)

#a{position:fixed}

JS (70 bajtów UTF-8)

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

Fragment zdekompilowany, ulepszony i wyjaśniony:

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
źródło
0

Mathematica 226 bajtów

Pozycja myszy względem ekranu jest śledzona przez przód, a pozycja okna notatnika dialogowego jest przesuwana za każdym razem, gdy mysz się porusza. Całkiem proste, ale polecenia są bardzo długie pod względem liter, jak często w przypadku Mathematica. Kliknięcie OK zamknie okno dialogowe.

{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 Po zakończeniu testowania uruchom to, aby usunąć opcję interfejsu użytkownika.

SetOptions[$FrontEndSession,FrontEndEventActions->None]

animacja ekranu

Kelly Lowder
źródło
Czy możesz dodać gif, aby udowodnić funkcjonalność? Nie mogę przetestować Mathematiki. Dzięki!
HyperNeutrino
-1

JavaScript (ES6) + HTML + CSS, 139 bajtów

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

Ponieważ nie możesz pozycjonować okien dialogowych alertów, stworzyłem niestandardowe okno dialogowe w HTML. Javascript rejestruje moduł obsługi zdarzenia na obiekcie okna i ustawia położenie na współrzędne zdarzenia.

Wypróbuj online: https://jsfiddle.net/1yohswje/

corvus_192
źródło
Powiem, że jest to nieprawidłowe, ponieważ nie tworzy niczego podobnego do legalnego „okna”, a także nie można powiedzieć, że ma to być okno z przyciskiem. Jest to jednak interesujące rozwiązanie!
HyperNeutrino
@HyperNeutrino Zaktualizowałem swoją odpowiedź. Co o tym sądzisz?
corvus_192
Dobrze. To jest teraz zgodne z moimi standardami. Masz +1
HyperNeutrino