다음 단계의 Windows 오류 상자


15

한 가지만 할 수있는 Windows 상자를 알고 있습니까?

Windows 오류 상자 : 진행하면 하드 드라이브의 내용이 삭제됩니다.  뭐하고 싶어?  <진행> <삭제>

이것을 다음 단계로 넘어 갑시다!

도전

어디에서나 커서를 따라가는 버튼으로 대화 상자를 만드십시오!

명세서

입력 할 수 없습니다. STDOUT 또는 STDERR로 출력 될 수 있습니다. 하나의 버튼으로 창을 열어야합니다 (텍스트는 필요하지 않지만 창 제목, 대화 상자 또는 버튼에 텍스트가 포함될 수 있음). 버튼을 클릭 할 수 있어야하며 클릭 할 수 있도록 항상 커서 아래를 따라야합니다. 클릭하면 원하는 작업을 수행 할 수 있지만 테스트 할 것이므로 컴퓨터가 충돌하지 않도록하십시오. 버튼을 누르지 않는 한 대화 상자가 열려 있어야하지만 필요하지는 않습니다. 버튼이 닫히면 닫힙니다.

할 수있는 가정

  • 커서가 도면 캔버스 안에있을 것이라고 가정 할 수 있습니다.
  • 창이 초점을 유지한다고 가정 할 수 있지만, 버튼을 누르지 않는 한 창에 초점을 두지 않아야합니다.

의사 코드 예

의사 코드의 예는 다음과 같습니다.

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

이 과제에 대한 테스트 사례를 제공 할 수 없습니다

이것은 코드 골프 도전이므로 3 월 14 일 (Pi Day)까지 가장 짧은 유효한 제출이 승리합니다!

답변:


9

MATLAB, 86 63 바이트

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

이 솔루션은 제공되는 부품이 해당 속성에만 고유 한 한 부분 속성 이름을 사용하는 MATLAB (일반적으로 성가신) 기능을 활용합니다.

이 솔루션은 내장 기능 warndlg을 사용하여 "확인"버튼이있는 경고 대화 상자를 만듭니다. 이 함수는 콜백 figure을 설정하는 데 사용할 수 있는 핸들을 반환합니다 WindowButtonMotionFcn(짧은 이름 사용 'WindowButtonM').

창 내에서 커서가 움직일 때마다 평가되는 콜백은 커서의 현재 위치를 가져옵니다 ( 루트 그래픽스 객체PointerLocation속성을 사용하여 짧은 이름 사용 ). 그런 다음 커서가 버튼에 놓 이도록 오프셋을 적용한 후 그림의 새 위치를 사용 하고 지정 하여 그림의 그림 을 업데이트 합니다.'Po'Positionmovegui[99, 20]

버튼을 마지막으로 클릭하면 그림이 삭제되고 모든 콜백이 자동으로 해제됩니다.

enter image description here


이 코드를 테스트 할 수있는 링크를 제공해 주시겠습니까? Matlab 소프트웨어가 없으며이 코드는 Octave에서 작동하지 않습니다 (특정 Matlab 코드와 만 호환되므로). 감사!
HyperNeutrino

3
@AlexL. 불행히도이 코드의 작동 방식을 보여주는 무료 온라인 유틸리티는 없습니다. 존재하더라도 UI 컨트롤은 웹 인터페이스에서 렌더링되지 않습니다. 코드 작동을 보여주기 위해 GIF를 포함 시켰습니다.
Suever

좋구나. 나는 테스트를 귀찮게하지 않습니다. 잘 했어, +1
HyperNeutrino

Windows R2014a의 몇 가지 문제 다음과 같은 방법으로 대화 상자를 중지 할 수 있습니다. 1. 대화 상자와 함께 마우스 상자를 작업 표시 줄 (내 작업 표시 줄이 화면 오른쪽에 있음)로 이동하면 대화 상자가 마우스를 따라 멈 춥니 다. 2. 마우스가 어떤 프레임에서든 대화 상자 외부에 있도록 마우스를 빠르게 움직입니다. 대화 상자의 스타일은 분명히 다른 것에 의존합니다 ... 현재 코드를 사용하면 마우스가 확인 버튼을 간신히 놓칠 수 없으며 작동하려면 99에서 120으로 변경해야합니다. 어쨌든 잘 했어!
Frenzy Li

이것이 내 관점에서 본 것입니다. 마우스가 빨간 십자선 근처에 있습니다.
Frenzy Li

4

C # (윈도우 폼 응용 프로그램), (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 2019

1

AutoHotkey를, 122 115 바이트

MsgBox
WinWait,%A_ScriptName%
Loop{
MouseGetPos,x,y
WinGetPos,a,b
ControlGetPos,c,d,,,Button1
WinMove,x+a-c,y+b-d
}

데모


2
좋고 간단합니다. 잘 했어! +1
HyperNeutrino 2019

1

자바 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();}}

MouseInfo 덕분에 -22 바이트 ( Zavada 에서 도난 당함 ) awt 라이브러리가 마음에 들지 않습니다.

여기서 주요 메소드를 제거하여 44 바이트를 줄였습니다. 이것이 애플릿으로 시작된 경우 기본 방법은 필요하지 않습니다. 이클립스의 "자바 애플릿으로 실행"을 통해 또는 보안 관리자를 비활성화 하고 JDK와 함께 제공되는 appletviewer를 사용하여 달성 할 수 있습니다 (웹 브라우저에서 애플릿을 볼 수있는 경우가 아니라면 크롬에서 허용하지는 않습니다) .

팝업


잘 했어, +1! 동의합니다. awt 라이브러리는 약간 추악하지만 골퍼입니다.
HyperNeutrino

import java.awt.event.*;
Zavada

@Zavada *와일드 카드는 하위 패키지를 재귀 적으로 가져 오지 않습니다. 나는 필요 java.awt.event위해 MouseAdapterMouseEvent
찌르지

사과, 나는 총 두뇌 방벽이 있었다!
Zavada

1

자바, 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));}};}}

언 골프 드 :

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()합니다.이 루프는 루프가 정상적으로 놓여 있으면 초기화 시간에 컴파일 시간 오류가 있기 때문에 필요합니다. 마우스 리스너 추가와 관련된 모든 초과 코드 대신 MouseInfo를 사용하기로 선택했습니다.

편집 : 추가하려면 카운트를 27 씩 늘 렸습니다 add(new java.awt.Button());. 나는 JDialogs가 기술적으로 암묵적 인 버튼을 가지고 있다고 생각했지만 잘못 된 것 같습니다.

편집 2 : setSize버튼을 클릭 할 수 있도록 마우스 위치를 추가 하고 오프셋해야했습니다.

대화


이것은 작동하지 않습니다. 커서가 지속적으로 창의 왼쪽 상단에 있기 때문에 버튼을 누를 수 없습니다. 이 문제를 해결하십시오! :)
HyperNeutrino

사과하세요, 지금 고쳐야합니다!
Zavada

네. 지금 작동합니다! +1
HyperNeutrino

나는 모르는 / MouseInfo는 것을 기억했다. 이것은 깔끔한 답변입니다.
Poke

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/history는
크리스토퍼

0

클로저, 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])

않습니다 하지 정품 윈도우 대화 상자를 만들 수 있습니다. 대신 가짜를 만들어 가운데에 더미 (비 기능) 버튼을 만듭니다.

이것은 의견에서 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]))

가짜 대화 상자


귀하의 담당자가 1000이고 너무 멋져 보이기 때문에 이것을지지하지 않으려는 유혹에 빠져 있습니다 ... 나는 이것을 유효한 솔루션으로 계산할 것입니다 (아마도 " 실제 "창)이므로 +1이 있습니다. :피
HyperNeutrino

@HyperNeutrino 고마워, 비록 이것이 작업에 심한 과잉 일지라도 1k의 담당자조차도 훌륭합니다. 나는 그것으로 재미 있었다! 어쩌면 비교를 위해 AWT 버전도 만들 것입니다. 아마도 길이의 절반과 같을 것입니다.
Carcigenicate

당신은 그때 2K를 기다릴 수 있습니다! : D
HyperNeutrino 2012

0

퍼그 / 슬림 + CSS / SCSS / LESS / 스타일러스 + ES6 자바 스크립트 (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'}}

디 컴파일, 언 골프 및 설명 스 니펫 :

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 바이트

화면을 기준으로 한 마우스 위치는 프런트 엔드에서 추적되며 마우스를 움직일 때마다 대화 상자 노트북의 창 위치가 이동합니다. 매우 간단하지만 종종 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];

추신 테스트가 끝나면 이것을 실행하여 프론트 엔드 옵션을 제거하십시오.

SetOptions[$FrontEndSession,FrontEndEventActions->None]

화면 애니메이션


기능을 증명하기 위해 gif를 추가 할 수 있습니까? Mathematica를 테스트 할 수 없습니다. 감사!
HyperNeutrino

-1

자바 스크립트 (ES6) + HTML + CSS, 139 바이트

HTML :

<d id=d><button>X

CSS :

d{background:red;padding:9px;position:absolute

자바 스크립트 :

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.