Windows Error Boxes ไปอีกระดับ


15

คุณรู้กล่อง Windows ที่คุณสามารถทำสิ่งเดียวเท่านั้น?

Windows Error Box: การดำเนินการต่อจะลบเนื้อหาในฮาร์ดไดรฟ์ของคุณ  เธออยากทำอะไรล่ะ?  <Proceed> <Delete>

มาเพิ่มระดับต่อไปกันเถอะ!

ท้าทาย

ทำกล่องโต้ตอบด้วยปุ่มที่ตามเคอร์เซอร์ของคุณทุกที่!

รายละเอียด

อาจไม่มีการป้อนข้อมูลใด ๆ อาจมีเอาต์พุตไปยัง STDOUT หรือ STDERR คุณต้องเปิดหน้าต่างด้วยปุ่มเดียว (ไม่จำเป็นต้องใช้ข้อความ แต่ข้อความอาจมีอยู่ในชื่อหน้าต่างกล่องโต้ตอบหรือปุ่ม) ปุ่มจะต้องสามารถคลิกได้และจะต้องปฏิบัติตามภายใต้เคอร์เซอร์ของคุณเพื่อให้คุณสามารถคลิกได้เท่านั้น เมื่อคลิกจะสามารถทำอะไรก็ได้ที่คุณต้องการ แต่โปรดอย่าทำให้คอมพิวเตอร์พังเพราะฉันจะทำการทดสอบนี้ ... กล่องโต้ตอบจะต้องเปิดอยู่ตราบเท่าที่ยังไม่ได้กดปุ่ม แต่ไม่จำเป็นต้อง ปิดเมื่อปุ่มถูกปิด

สมมติฐานที่คุณสามารถทำได้

  • คุณอาจสมมติว่าเคอร์เซอร์จะอยู่ในพื้นที่วาดรูป
  • คุณอาจสมมติว่าหน้าต่างจะยังคงอยู่ในโฟกัส แต่คุณต้องไม่ดึงหน้าต่างออกจากการโฟกัสตราบใดที่ยังไม่ได้กดปุ่ม

Pseudocode ตัวอย่าง

นี่คือตัวอย่างรหัสเทียม:

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

ไม่สามารถให้เคสทดสอบสำหรับความท้าทายนี้ได้

นี่เป็นความท้าทายของการเล่นกอล์ฟดังนั้นการส่งที่ถูกต้องที่สุดในวันที่ 14 มีนาคม (วัน Pi) จะชนะ!

คำตอบ:


9

MATLAB, 86 63 ไบต์

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

โซลูชันนี้ใช้ประโยชน์จากความสามารถของ MATLAB (โดยทั่วไปน่ารำคาญ) ในการใช้ชื่อคุณสมบัติบางส่วนตราบใดที่ส่วนที่ให้ไว้นั้นไม่ซ้ำกันกับคุณสมบัติที่น่าสนใจเท่านั้น

วิธีการแก้ปัญหานี้ใช้ builtin warndlgเพื่อสร้างการโต้ตอบการเตือนด้วยปุ่ม "ตกลง" ฟังก์ชั่นนี้จะส่งกลับfigureหมายเลขอ้างอิงซึ่งเราสามารถใช้เพื่อตั้งค่าการWindowButtonMotionFcnเรียกกลับ (ใช้ชื่อย่อ'WindowButtonM')

การเรียกกลับที่ถูกประเมินเมื่อใดก็ตามที่เคอร์เซอร์ถูกย้ายภายในหน้าต่างจะได้รับตำแหน่งปัจจุบันของเคอร์เซอร์ (ใช้PointerLocationคุณสมบัติของวัตถุกราฟิกรูทโดยใช้ชื่อย่อ'Po') จากนั้นเราอัปเดตPositionตัวเลขที่ใช้moveguiและระบุตำแหน่งใหม่ของรูปภาพหลังจากใช้ออฟเซ็ต[99, 20]เพื่อให้เคอร์เซอร์วางอยู่บนปุ่ม

เมื่อคลิกปุ่มสุดท้ายตัวเลขจะถูกลบและการโทรกลับทั้งหมดจะถูกปล่อยโดยอัตโนมัติ

enter image description here


คุณช่วยระบุลิงก์เพื่อทดสอบโค้ดนี้ได้ไหม ฉันไม่มีซอฟต์แวร์ Matlab และรหัสนี้ใช้ไม่ได้กับ Octave (เนื่องจากมันเข้ากันได้กับรหัส Matlab บางตัวเท่านั้น) ขอบคุณ!
HyperNeutrino

3
@AlexL น่าเสียดายที่ไม่มียูทิลิตี้ออนไลน์ฟรีสำหรับการแสดงวิธีการทำงานของรหัสนี้ แม้ว่าจะมีการควบคุม UI จะไม่ถูกแสดงผลในเว็บอินเตอร์เฟส ฉันได้รวม GIF เพื่อสาธิตการทำงานของรหัส
Suever

Alright ฉันจะไม่รบกวนการทดสอบในตอนนั้น ดีมากมี +1
HyperNeutrino

ปัญหาสองสามอย่างใน Windows R2014a คุณสามารถหยุดกล่องโต้ตอบจากการติดตามโดย: 1. เลื่อนเมาส์ (พร้อมกล่องโต้ตอบ) ไปที่ทาสก์บาร์ (ทาสก์บาร์ของฉันอยู่ทางด้านขวาของหน้าจอ) และกล่องโต้ตอบจะหยุดตามเมาส์; 2. เลื่อนเมาส์ให้เร็วพอจนเมาส์อยู่นอกกรอบข้อความใด ๆ ณ จุดนั้นกล่องจะหยุดตามเมาส์ รูปแบบของกล่องโต้ตอบนั้นขึ้นอยู่กับสิ่งอื่น ... ด้วยรหัสปัจจุบันเมาส์ของฉันแทบจะไม่ได้ปุ่ม OK และฉันต้องเปลี่ยน 99 เป็น 120 เพื่อให้ทำงานได้ อย่างไรก็ตามงานดี!
Frenzy Li

นี่คือสิ่งที่ฉันเห็นจากมุมมองของฉัน เมาส์ของฉันอยู่ใกล้กับกากบาทสีแดงนั้น
Frenzy Li

4

C # (แอปพลิเคชันฟอร์ม Windows), 200 114 ไบต์

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

ยกเลิกแข็งแรงเล่นกอล์ฟ

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

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

โซลูชัน 200 ไบต์เก่า:

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

ยกเลิกแข็งแรงเล่นกอล์ฟ

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

ป้อนคำอธิบายรูปภาพที่นี่


1
เยี่ยมมาก! +1 :)
HyperNeutrino

1
รอ .... ดังนั้นใน C # คุณสามารถเพิ่มผู้ฟังเหตุการณ์โดยทำEvent += listenerอะไร นั่นยอดเยี่ยม :-)
ETHproductions

@ETHproductions อาจทำเช่นนั้นใน C ++ ด้วยเช่นกันหากคุณใช้งาน+ตัวดำเนินการมากเกินไป ยังคงรวบรัดมาก
Carcigenicate


1

Java 7, 294 289 286 264 220 ไบต์

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 ไบต์ขอบคุณ MouseInfo (ถูกขโมยจากZavada ) ฉันไม่ชอบไลบรารี awt>.>

ฉันโกนออกไป 44 ไบต์ด้วยการลบวิธีการหลักที่นี่ วิธีการหลักไม่จำเป็นหากเปิดใช้เป็นแอปเพล็ต สิ่งนี้สามารถทำได้ผ่าน "Run As Java Applet" ของ eclipse หรือโดยการปิดการใช้งานตัวจัดการความปลอดภัยและการใช้appletviewerซึ่งมาพร้อมกับ JDK (เว้นแต่คุณจะยังสามารถดู applets ในเว็บเบราว์เซอร์ได้ฉันไม่คิดว่า .

ป๊อปอัพ


เยี่ยมมาก +1! ฉันเห็นด้วยห้องสมุด awt นั้นน่าเกลียดนิดหน่อย แต่ก็เป็นนักกอล์ฟ
HyperNeutrino

คุณสามารถบันทึก 24 ไบต์โดยการลบimport java.awt.event.*;
Zavada

@Zavada *สัญลักษณ์แทนไม่นำเข้าแพคเกจย่อยซ้ำ ฉันต้องการjava.awt.eventสำหรับMouseAdapterและMouseEvent
Poke

ขอโทษฉันมีความคิดทั้งหมด!
Zavada

1

Java, 172 199 235 ไบต์

แข็งแรงเล่นกอล์ฟ:

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

    }
}

คำอธิบาย: ฉันใช้การเริ่มต้นวงเล็บปีกกาคู่ในการประกาศของฉันของ JDialog ใหม่ ที่บันทึกไว้นี้ไบต์โดยไม่รวมส่วนขยายของ JDialog (ที่ช่วยให้ผมประหยัดไบต์ไม่รวมpublicจากmain) ภายในคลาสย่อยที่ไม่ระบุชื่อของ JDialog ฉันทำให้มันมองเห็นได้ (ใช้1>0แทนtrue) และการโทรa()ซึ่งเป็นสิ่งจำเป็นเพราะ initalizer มีข้อผิดพลาดในการคอมไพล์เวลาหากวนลูปอยู่ในปกติ ฉันเลือกที่จะใช้ MouseInfo มากกว่ารหัสส่วนเกินทั้งหมดที่เกี่ยวข้องกับการเพิ่มฟังเม้าส์

แก้ไข: มีการเพิ่มจำนวนขึ้น 27 add(new java.awt.Button());เพื่อเพิ่ม ฉันคิดว่า JDialog มีปุ่มบอกเป็นนัยตามหลักวิชาการ แต่ดูเหมือนว่าฉันจะผิด

แก้ไข 2: ต้องเพิ่มsetSizeและชดเชยตำแหน่งของเมาส์เพื่อให้ปุ่มคลิกได้

โต้ตอบ


มันใช้งานไม่ได้ ฉันไม่สามารถกดปุ่มได้เนื่องจากเคอร์เซอร์อยู่ที่มุมบนซ้ายของหน้าต่างตลอดเวลา โปรดแก้ไขสิ่งนี้! :)
HyperNeutrino

ขออภัยตอนนี้ควรได้รับการแก้ไข!
Zavada

อ๋อ ใช้งานได้ทันที! +1
HyperNeutrino

ฉันไม่รู้ / จำ MouseInfo ได้ นี่คือคำตอบที่เรียบร้อย
โผล่

1
@ Poke ขอบคุณ ฉันเห็นคำตอบของคุณโดยใช้แอปเพล็ตและฉันมีความเกลียดชังที่ไม่สมเหตุสมผลสำหรับแอปเพล็ตดังนั้นฉันรู้สึกว่ามันน่ารักที่จะแกว่ง คำตอบของคุณดีมาก :)
Zavada

0

การประมวลผลที่แก้ไขแล้ว Js 102 108 ไบต์

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

ลองออนไลน์! เพิ่งอัปเดตลิงค์ของฉัน!

มันแค่วาดสี่เหลี่ยมที่ตามเมาส์ของคุณและสี่เหลี่ยมเล็ก ๆ ที่อยู่ภายในมันที่คุณคลิกและมันเปลี่ยนเป็นสีแดง มันใช้งานได้ แต่ไม่น่าอัศจรรย์ รุ่นนี้หากเข้มงวดมากในการจัดฟันและทั้งหมดนั้น :(


คุณสามารถลบวงเล็บปีกกาเติม
Kritixi Lithos

@KritixiLithos ฉันทำไม่ได้จริง :(
Christopher

เป็นรุ่นภาษาที่เคร่งครัด
Christopher

คุณสามารถใช้การประมวลผลประเภทอื่นเพื่อบันทึกจำนวนไบต์ได้
Kritixi Lithos

@KritixiLithos ที่จริงแล้วฉันจะต้องตั้งค่าขนาดหน้าจอและที่จะเพิ่มไบต์ (หมายเหตุด้านข้างฉันเพิ่งถูกเตะจากการแชทเพราะ "เนื้อหาที่ไม่เหมาะสมคิดอะไรทำไมมันเป็นบอทด้วยเช่นกันchat.stackexchange.com/messages/35631789/ ประวัติศาสตร์เป็นเพราะเหตุใด
ริสโตเฟอร์

0

Clojure 525 ไบต์

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

ไม่ได้สร้างโต้ตอบ Windows ของแท้ แต่จะสร้างของปลอมขึ้นมาและสร้างปุ่มจำลอง (ไม่ทำงาน) ตรงกลาง

สิ่งนี้ได้รับอนุญาตจาก OP ในความคิดเห็น

ใช้ไลบรารี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]))

กล่องโต้ตอบปลอม


ฉันอยากจะไม่ลงคะแนนเพราะตัวแทนของคุณคือ 1,000 และมันดูดีมาก ... ฉันจะนับว่าเป็นโซลูชันที่ถูกต้อง (เพียงเพราะฉันได้ตรวจสอบแล้วโซลูชันที่คล้ายกันที่ไม่ได้สร้าง " หน้าต่าง "ของจริง") มี +1 : P
HyperNeutrino

@HyperNeutrino ขอบคุณแม้ว่าจะเป็นงานมากเกินไปสำหรับงานและแม้แต่ตัวแทน 1k ก็ดี ฉันสนุกกับมัน! บางทีฉันอาจสร้างรุ่น AWT ด้วยเพื่อการเปรียบเทียบ อาจจะเป็นครึ่งความยาว
Carcigenicate

คุณสามารถรอได้เพียง 2k เท่านั้น! : D
HyperNeutrino

0

Pug / Slim + CSS / SCSS / LESS / Stylus + ES6 Javascript (98 ไบต์)

ลองออนไลน์!

ปั๊ก (10 UTF-8 ไบต์)

button#a X

สไตลัส (18 UTF-8 ไบต์)

#a{position:fixed}

JS (70 UTF-8 ไบต์)

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

แยกส่วน Ungolfed และอธิบายตัวอย่าง:

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 Bytes

ตำแหน่งเมาส์ที่สัมพันธ์กับหน้าจอจะถูกติดตามโดยส่วนหน้าและตำแหน่งหน้าต่างของสมุดบันทึกโต้ตอบจะถูกย้ายเมื่อใดก็ตามที่เมาส์เคลื่อนย้าย ค่อนข้างง่าย แต่คำสั่งมีความยาวมากในแง่ของตัวอักษรบ่อยครั้งในกรณีของ Mathematica การคลิกตกลงจะเป็นการปิดกล่องโต้ตอบ

{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 เมื่อคุณทำการทดสอบเสร็จให้เรียกใช้ตัวเลือกนี้เพื่อลบตัวเลือกส่วนหน้า

SetOptions[$FrontEndSession,FrontEndEventActions->None]

ภาพเคลื่อนไหวหน้าจอ


คุณสามารถเพิ่ม gif เพื่อพิสูจน์การทำงานได้หรือไม่? ฉันไม่สามารถทดสอบ Mathematica ได้ ขอบคุณ!
HyperNeutrino

-1

Javascript (ES6) + HTML + CSS, 139 ไบต์

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

เนื่องจากคุณไม่สามารถวางตำแหน่งกล่องโต้ตอบการแจ้งเตือนได้ฉันจึงสร้างกล่องโต้ตอบแฟนซีสุดวิเศษเป็น HTML จาวาสคริปต์ลงทะเบียนตัวจัดการเหตุการณ์บนวัตถุหน้าต่างและกำหนดตำแหน่งให้เป็นพิกัดของเหตุการณ์

ลองออนไลน์: https://jsfiddle.net/1yohswje/


ฉันจะบอกว่ามันไม่ถูกต้องเพราะมันไม่ได้สร้างอะไรที่คล้ายกับ "หน้าต่าง" ที่ถูกกฎหมายและคุณไม่สามารถบอกได้ว่ามันเป็นหน้าต่างที่มีปุ่ม อย่างไรก็ตามมันเป็นทางออกที่น่าสนใจ!
HyperNeutrino

@HyperNeutrino ฉันได้อัปเดตคำตอบของฉันแล้ว คุณคิดยังไงกับสิ่งนี้?
corvus_192

ตกลง. ที่เป็นไปตามมาตรฐานของฉันตอนนี้ มี +1
HyperNeutrino
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.