Kotak Kesalahan Windows ke tingkat berikutnya

15

Anda tahu kotak-kotak Windows di mana Anda hanya bisa melakukan satu hal?

Windows Error Box: Memproses akan menghapus isi hard drive Anda.  Apa yang ingin kamu lakukan?  <Lanjutkan> <Hapus>

Mari kita bawa ini ke level selanjutnya!

Tantangan

Buat kotak dialog dengan tombol yang mengikuti kursor Anda di mana-mana!

Spesifikasi

Tidak ada input yang dapat diambil. Mungkin ada output untuk STDOUT atau STDERR. Anda harus membuka jendela dengan satu tombol (tidak perlu teks, tetapi teks dapat dimuat dalam judul jendela, kotak dialog, atau tombol). Tombol harus dapat diklik, dan itu harus selalu mengikuti di bawah kursor Anda sehingga Anda hanya dapat mengkliknya. Setelah mengklik, itu dapat melakukan apa pun yang Anda inginkan, tapi tolong jangan membuatnya crash komputer karena saya akan menguji ini ... Kotak dialog harus tetap terbuka selama tombol tidak ditekan, tetapi tidak perlu tutup ketika tombol ditutup.

Asumsi yang bisa Anda buat

  • Anda dapat mengasumsikan bahwa kursor akan tetap berada di dalam kanvas gambar.
  • Anda mungkin berasumsi bahwa jendela akan tetap fokus, tetapi Anda tidak boleh meletakkan jendela tidak fokus selama tombol tidak ditekan.

Contoh Pseudocode

Inilah beberapa contoh pseudocode:

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

Uji Kasus tidak dapat disediakan untuk tantangan ini

Ini adalah tantangan kode-golf, sehingga pengiriman terpendek yang sah hingga 14 Maret (Hari Pi) menang!

HyperNeutrino
sumber

Jawaban:

9

MATLAB, 86 63 byte

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

Solusi ini memanfaatkan kemampuan MATLAB (biasanya menjengkelkan) untuk menggunakan sebagian nama properti selama bagian yang disediakan hanya unik untuk properti yang diminati.

Solusi ini menggunakan bawaan warndlguntuk membuat dialog peringatan dengan tombol "OK". Fungsi ini mengembalikan figurepegangan yang kemudian dapat kita gunakan untuk mengatur WindowButtonMotionFcnpanggilan balik (menggunakan nama pendek 'WindowButtonM').

Callback yang dievaluasi setiap kali kursor dipindahkan dalam jendela mendapatkan posisi kursor saat ini (menggunakan PointerLocationproperti objek grafik root , menggunakan nama pendeknya 'Po'). Kami kemudian memperbarui Positiongambar menggunakan moveguidan menentukan lokasi baru dari gambar setelah menerapkan offset[99, 20] sehingga kursor ditempatkan pada tombol.

Ketika tombol akhirnya diklik, angka itu dihapus dan semua panggilan balik secara otomatis dilepaskan.

enter image description here

Suever
sumber
Bisakah Anda memberikan tautan untuk menguji kode ini? Saya tidak memiliki perangkat lunak Matlab, dan kode ini tidak berfungsi dengan Oktaf (karena hanya kompatibel dengan kode Matlab tertentu). Terima kasih!
HyperNeutrino
3
@AlexL. Sayangnya tidak ada utilitas online gratis untuk menunjukkan cara kerja kode ini. Bahkan jika ada, kontrol UI tidak akan ditampilkan di antarmuka web. Saya telah menyertakan GIF untuk mendemonstrasikan kode berfungsi.
Suever
Baik. Saya tidak akan repot pengujian. Kerja bagus, punya +1.
HyperNeutrino
Beberapa masalah pada Windows R2014a. Anda dapat menghentikan kotak dialog agar tidak mengikuti dengan: 1. Memindahkan kotak mouse Anda (bersama dengan dialog) ke taskbar (taskbar saya ada di sisi kanan layar) dan kotak dialog akan berhenti mengikuti mouse; 2. Gerakkan mouse Anda cukup cepat sehingga mouse berada di luar kotak dialog di bingkai mana pun, di titik mana kotak itu akan berhenti mengikuti mouse. Gaya kotak dialog juga tampaknya tergantung pada sesuatu yang lain ... dengan kode saat ini, mouse saya hampir tidak melewatkan tombol OK, dan saya harus mengubah 99 hingga 120 agar berfungsi. Bagaimanapun, kerja bagus!
Frenzy Li
Ini yang saya lihat dari sudut pandang saya. Mouse saya berada di dekat crosshair merah itu.
Frenzy Li
4

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

Tidak Golf

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

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

Solusi 200 byte lama:

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

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

enter image description here

Oliver
sumber
1
Kerja bagus! +1 :)
HyperNeutrino
1
Tunggu .... jadi di C #, Anda dapat menambahkan pendengar acara dengan melakukan Event += listener? Itu luar biasa :-)
ETHproduk
@ ETHproductions Mungkin bisa melakukannya di C ++ juga jika Anda kelebihan +operator. Masih sangat ringkas.
Carcigenicate
1

AutoHotkey, 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
}

Demo

Kodos Johnson
sumber
2
Bagus dan sederhana. Kerja bagus! +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 berkat MouseInfo (dicuri dari Zavada ) Saya tidak suka perpustakaan awt>.>

Saya mencukur 44 byte dengan menghapus metode utama di sini. Metode utama tidak diperlukan jika ini diluncurkan sebagai applet. Ini dapat dicapai melalui eclipse's "Run As Java Applet" atau dengan menonaktifkan manajer keamanan dan menggunakan appletviewer , yang datang dengan JDK (kecuali Anda masih dapat melihat applet di browser web. Saya tidak berpikir chrome mengizinkan ini) .

popup

Menyodok
sumber
Kerja bagus, +1! Saya setuju, perpustakaan awt agak jelek, tapi itu golfier.
HyperNeutrino
Anda dapat menyimpan 24 byte dengan menghapusimport java.awt.event.*;
Zavada
@Zavada *Wildcard tidak mengimpor sub paket secara rekursif. Saya perlu java.awt.eventuntuk MouseAdapterdanMouseEvent
Poke
Permintaan maaf, saya punya ide total!
Zavada
1

Jawa, 172 199 235 Bytes

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;;p=MouseInfo.getPointerInfo().getLocation(),setLocation(p.x-9,p.y-70));}};}}

Tidak Disatukan:

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

    }
}

Penjelasan: Saya menggunakan inisialisasi penjepit ganda pada deklarasi JDialog baru saya. Ini menyimpan byte dengan mengecualikan ekstensi JDialog (memungkinkan saya untuk menyimpan byte yang tidak termasuk publicdari main). Di dalam subkelas anonim JDialog, saya membuatnya terlihat (menggunakan 1>0alih-alih true) dan menelepona() , yang diperlukan karena initalizer memiliki kesalahan waktu kompilasi jika loop duduk di dalamnya secara normal. Saya memilih untuk menggunakan MouseInfo daripada semua kode berlebih yang terkait dengan menambahkan pendengar mouse.

Sunting: Harus menambah jumlah sebanyak 27 untuk ditambahkan add(new java.awt.Button()); . Saya pikir JDialogs memiliki tombol tersirat oleh teknis, tetapi saya tampaknya salah.

Sunting 2: Harus menambah setSizedan mengimbangi lokasi mouse untuk membuat tombol dapat diklik.

Dialog

Zavada
sumber
Ini tidak berhasil; Saya tidak dapat menekan tombol karena kursor selalu berada di sudut kiri atas jendela. Tolong perbaiki ini! :)
HyperNeutrino
Permintaan maaf, harus diperbaiki sekarang!
Zavada
Ya. Sekarang bekerja! +1
HyperNeutrino
Saya tidak tahu / ingat MouseInfo adalah sesuatu. Ini jawaban yang rapi.
Poke
1
@ Poke, terima kasih. Saya melihat jawaban Anda menggunakan applet, dan saya memiliki kebencian yang tidak masuk akal untuk applet, jadi saya merasa itu akan lucu untuk dilakukan dalam ayunan. Jawaban Anda bagus :)
Zavada
0

Modifikasi Pemrosesan Js 102 108 byte

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

Cobalah online! Baru saja memperbarui tautan saya!

Itu hanya menggambar persegi panjang yang mengikuti mouse Anda dan persegi panjang yang lebih kecil di dalamnya yang Anda klik dan berubah menjadi merah. Ini bekerja tetapi tidak luar biasa. Versi ini jika sangat ketat pada kawat gigi dan semua itu :(

Christopher
sumber
Anda dapat menghapus kawat gigi di sekitar fill
Kritixi Lithos
@ KritixiLithos Saya benar-benar tidak bisa :(
Christopher
Ini adalah versi bahasa yang benar-benar ketik
Christopher
Anda bisa menggunakan tipe Pemrosesan lain untuk menyimpan byte saat itu
Kritixi Lithos
@ KritixiLithos sebenarnya maka saya juga harus mengatur ukuran layar dan itu akan menambah byte. (Catatan samping saya baru saja dikeluarkan dari obrolan karena "konten yang tidak pantas, ada ide mengapa? Itu juga bot. Chat.stackexchange.com/messages/35631789/history adalah alasannya
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])

Apakah tidak membuat dialog Windows asli. Sebaliknya, itu membangun yang palsu, dan menciptakan tombol dummy (tidak berfungsi) di tengah.

Ini diizinkan oleh OP dalam komentar.

Menggunakan perpustakaan 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]))

Fake Dialog

Carcigenicate
sumber
Saya tergoda untuk tidak memperbaiki ini karena perwakilan Anda 1000 dan kelihatannya bagus ... Saya akan menghitung ini sebagai solusi yang valid (hanya karena saya sudah memvalidasi solusi serupa yang tidak membuat " "nyata"), jadi miliki +1. : P
HyperNeutrino
@HyperNeutrino Terima kasih, meskipun ini adalah pekerjaan berat yang berlebihan, dan perwakilan 1k yang baik. Saya bersenang-senang dengan itu! Mungkin saya akan membuat versi AWT juga hanya untuk perbandingan. Mungkin akan seperti setengah panjangnya.
Carcigenicate
Anda tinggal menunggu 2k saja! : D
HyperNeutrino
0

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

Cobalah online!

Pug (10 UTF-8 Bytes)

button#a X

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

Didekompilasi, Tidak Disatukan, dan dijelaskan Cuplikan:

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

Mathematica 226 Bytes

Posisi mouse relatif terhadap layar dilacak oleh ujung depan dan posisi jendela notebook dialog dipindahkan setiap kali mouse bergerak. Cukup sederhana, tetapi perintahnya sangat panjang dalam hal huruf, seperti yang sering terjadi dengan Mathematica. Mengklik OK akan menutup dialog.

{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 Ketika Anda selesai menguji, jalankan ini untuk menghapus opsi ujung depan.

SetOptions[$FrontEndSession,FrontEndEventActions->None]

screen animation

Kelly Lowder
sumber
Bisakah Anda menambahkan gif untuk membuktikan fungsionalitas? Saya tidak dapat menguji Mathematica. Terima kasih!
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'}}

Karena Anda tidak dapat memposisikan dialog peringatan, saya membuat dialog super mewah khusus saya dalam HTML. Javascript mendaftarkan pengendali acara pada objek jendela dan mengatur posisi ke koordinat acara.

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

corvus_192
sumber
Saya akan mengatakan ini tidak valid, karena tidak membuat apa pun yang mirip dengan "jendela" yang sah, dan juga, Anda tidak dapat mengatakan bahwa ini dimaksudkan sebagai jendela dengan tombol. Namun, ini adalah solusi yang menarik!
HyperNeutrino
@HyperNeutrino Saya telah memperbarui jawaban saya. Apa pendapatmu tentang ini?
corvus_192
Baik. Itu sesuai dengan standar saya sekarang. Punya +1
HyperNeutrino