Bir sonraki seviyeye Windows Hata Kutuları


15

Sadece bir şey yapabileceğiniz Windows kutularını biliyor musunuz?

Windows Hata Kutusu: Devam ederseniz sabit sürücünüzün içeriği silinir.  Ne yapmak istiyorsun?  <Devam et> Sil

Bunu bir sonraki seviyeye taşıyalım!

Meydan okuma

İmlecinizi her yerde takip eden bir düğmeyle iletişim kutusu oluşturun!

gözlük

Hiçbir giriş alınamaz. STDOUT veya STDERR için çıkış olabilir. Bir düğmeyle bir pencere açmalısınız (metin gerekmez, ancak pencere başlığında, iletişim kutusunda veya düğmede metin bulunabilir). Düğme tıklanabilir olmalıdır ve yalnızca tıklayabilmeniz için her zaman imlecinizin altında kalmalıdır. Tıkladığınızda, istediğiniz her şeyi yapabilir, ancak bunu bir bilgisayar çökmesine neden olmayın çünkü bunu test edeceğim ... İletişim kutusu düğmeye basılmadığı sürece açık kalmalıdır, ancak buna gerek yoktur düğme kapatıldığında kapatın.

Yapabileceğiniz varsayımlar

  • İmlecin çizim tuvalinde kalacağını varsayabilirsiniz.
  • Pencerenin odakta kalacağını varsayabilirsiniz, ancak düğmeye basılmadığı sürece pencereyi odaktan çıkarmamalısınız.

Örnek Sahte Kod

İşte bazı örnek sözde kod:

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

Bu sorun için Test Durumları sağlanamaz

Bu bir kod-golf mücadelesi, bu nedenle 14 Mart (Pi Günü) tarafından en kısa geçerli başvuru kazanır!

Yanıtlar:


9

MATLAB, 86 63 bayt

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

Bu çözüm, sağlanan parça yalnızca ilgili mülke özgü olduğu sürece MATLAB'ın (tipik olarak can sıkıcı) kısmi özellik adlarını kullanma yeteneğinden yararlanır.

Bu çözüm yerleşik olanı warndlg"Tamam" düğmesiyle bir uyarı iletişim kutusu oluşturmak için kullanır . Bu işlev figuredaha sonra WindowButtonMotionFcngeri aramayı ayarlamak için kullanabileceğimiz bir tanıtıcı döndürür (kısa adı kullanarak 'WindowButtonM').

İmlecin pencerenin içine taşındığı her zaman değerlendirilen geri arama, imlecin geçerli konumunu alır ( kök grafik nesnesininPointerLocation özelliğini kullanarak, kısa adını kullanarak ). Daha sonra , imlecin düğmeye yerleştirilmesi için bir ofset uyguladıktan sonra şeklin yeni konumunu kullanarak ve şeklin yeni konumunu güncelleyeceğiz .'Po'Positionmovegui[99, 20]

Düğme sonunda tıklandığında, şekil silinir ve tüm geri aramalar otomatik olarak serbest bırakılır.

enter image description here


Lütfen bu kodu test etmek için bir bağlantı sağlayabilir misiniz? Matlab yazılımım yok ve bu kod Octave ile çalışmıyor (çünkü sadece belirli Matlab koduyla uyumlu). Teşekkürler!
HyperNeutrino

3
@AlexL. Ne yazık ki bu kodun nasıl çalıştığını gösteren ücretsiz bir çevrimiçi yardımcı program yoktur. Olsa bile, UI denetimleri web arayüzünde oluşturulmayacak. Kodun çalıştığını göstermek için GIF'i ekledim.
Suever

Peki. O zaman test etmeyeceğim. İyi iş, +1.
HyperNeutrino

Windows R2014a ile ilgili birkaç sorun. İletişim kutusunun aşağıdakileri yapmasını engelleyebilirsiniz: 1. Farenizi (iletişim kutusuyla birlikte) görev çubuğuna (görev çubuğum ekranın sağ tarafındadır) hareket ettirdiğinizde iletişim kutusu fareyi izlemeyi durduracaktır; 2. Farenizi, herhangi bir karedeki iletişim kutusunun dışında olacak şekilde yeterince hızlı hareket ettirin; bu noktada kutunun fareyi izlemesi durur. İletişim kutusunun stili de görünüşte başka bir şeye bağlı ... geçerli kodla, farem OK düğmesini zar zor kaçırıyor ve çalışmak için 99 ila 120 değiştirmek zorundayım. Her neyse, iyi iş çıkardın!
Frenzy Li

Bu benim bakış açısıyla gördükleri şeydir. Farem bu kırmızı artı işaretinin yakınında bir yerde.
Frenzy Li

4

C # (Windows Form Uygulaması) 200 114 bayt

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

Eski 200 baytlık çözüm:

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

enter image description here


1
Aferin! +1 :)
HyperNeutrino

1
Bekle .... yani C # 'da yaparak bir olay dinleyicisi ekleyebilirsiniz Event += listener? Bu harika :-)
ETHproductions

@ETHproductions Operatörü aşırı yüklerseniz, bunu büyük olasılıkla C ++ ile de yapabiliriz +. Hala çok özlü.
Şubat'ta Carcigenicate

1

Otomatik Kısayol tuşu, 122 115 bayt

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

Demo


2
Güzel ve basit. Aferin! +1
HyperNeutrino

1

Java 7, 294 289 286 264 220 bayt

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 (çalınan mouseinfo sayesinde bayt ZÁVADA ben awt kütüphaneler> sevmiyorum).>

Burada ana yöntemi kaldırarak 44 bayt tıraş ettim. Bir uygulama olarak başlatılırsa ana yönteme gerek yoktur. Bu, eclipse'nin "Java Olarak Çalıştır Applet'i" veya güvenlik yöneticisini devre dışı bırakarak ve JDK ile birlikte gelen appletviewer'ı kullanarak gerçekleştirilebilir (hala web tarayıcılarında uygulamaları görüntüleyemiyorsanız. Chrome'un buna izin vermediğini düşünmüyorum) .

açılır


İyi iş, +1! Kabul ediyorum, awt kütüphaneleri biraz çirkin, ama daha golfçü.
HyperNeutrino

24 bayt kaldırarak kaydedebilirsinizimport java.awt.event.*;
Zavada

@Zavada *Joker karakter, alt paketleri özyinelemeli olarak almaz. İhtiyacım java.awt.eventolan MouseAdapterveMouseEvent
Poke

Özür dilerim, tam bir beyin arkadaşım vardı!
Zavada

1

Java, 172 199 235 Bayt

golfed:

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

    }
}

Açıklama: Yeni bir JDialog bildirimimde çift ayraç başlatma kullanıyorum. Bu (benim hariç bayt kaydetmek için izin JDialog uzatılmasını hariç tutarak bayt kaydedildi publicdan main). JDialog'un anonim alt sınıfının içinde görünür hale getiriyorum ( 1>0yerine kullanarak true) ve çağrı a(), çünkü döngü normalde oturduysa initalizer bir derleme zamanı hatası var. Bir fare dinleyicisi ekleyerek ilişkili tüm fazla kodu yerine MouseInfo kullanmayı seçtim.

Düzenleme: Eklemek için sayıyı 27 artırmak zorunda kaldım add(new java.awt.Button()); . JDialogs'un teknik olarak ima edilen bir düğmesi olduğunu düşündüm, ama yanılıyor gibiyim.

Edit 2: setSizeDüğmeyi tıklanabilir hale getirmek için fare konumu eklemek ve dengelemek zorunda kaldım .

diyalog


Bu pek işe yaramıyor; Düğmeye basamıyorum çünkü imleç sürekli olarak pencerenin sol üst köşesinde. Lütfen bunu düzeltin! :)
HyperNeutrino

Özür dilerim, şimdi düzeltilmelidir!
Zavada

Evet. Şimdi çalışıyor! +1
HyperNeutrino

MouseInfo'nun bir şey olduğunu bilmiyor / hatırlamıyordum. Bu düzgün bir cevap.
Poke

1
@ Teşekkürler. Cevabınızı appletleri kullanarak gördüm ve appletler için mantıksız bir nefretim var, bu yüzden hızıyla yapmanın sevimli olacağını hissettim. Cevabınız güzel olsa :)
Zavada

0

Değiştirilmiş İşleme Js 102 108 bayt

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

Çevrimiçi deneyin! Sadece bağlantımı güncelledim!

Sadece farenizi takip eden bir dikdörtgen ve içine tıkladığınız daha küçük bir dikdörtgen çizer ve kırmızıya döner. Çalışıyor ama şaşırtıcı değil. Bu sürüm diş telleri üzerinde çok katı ise ve bunların hepsi :(


Dolgu çevresindeki parantezleri kaldırabilirsiniz
Kritixi Lithos

@KritixiLithos Aslında yapamam :(
Christopher

Kesinlikle yazılan bir dil sürümüdür
Christopher

Daha sonra bayt kaydetmek için başka bir İşlem türü kullanabilirsiniz
Kritixi Lithos

@KritixiLithos aslında o zaman ben de bir ekran boyutu ayarlamak zorunda kalacak ve bu bayt eklemek olacaktır. (Yan not az önce "uygunsuz içerik için herhangi bir fikir neden?" Diye bir bot oldu . Chat.stackexchange.com/messages/35631789/history neden oldu
Christopher

0

Clojure, 525 bayt

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

mu not orijinal bir Windows iletişim kutusu oluşturun. Bunun yerine, sahte bir tane oluşturur ve ortada bir kukla (çalışmayan) düğme oluşturur.

Bu yorumlarda OP tarafından izin verildi.

Quil kütüphanesini kullanır .

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

Sahte İletişim Kutusu


Temsilciniz 1000 olduğu ve çok güzel göründüğü için bunu onaylamamayı tercih ediyorum ... Bunu geçerli bir çözüm olarak sayacağım (basitçe bir " gerçek "pencere), bir +1 var. : P
HyperNeutrino

@HyperNeutrino Teşekkürler, bu görev için ağır bir overkill olsa bile ve hatta 1k temsilcisi güzel. Onunla eğlendim! Belki de sadece karşılaştırma için bir AWT sürümü oluşturacağım. Muhtemelen uzunluğun yarısı gibi olacak.
Şubat'ta Carcigenicate

O zaman sadece 2k bekleyebilirsin! : D
HyperNeutrino

0

Pug / Slim + CSS / SCSS / DAHA AZ / Stylus + ES6 Javascript (98 Bayt)

Çevrimiçi deneyin!

Pug (10 UTF-8 Bayt)

button#a X

Kalem (18 UTF-8 Bayt)

#a{position:fixed}

JS (70 UTF-8 Bayt)

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

Ayrıştırılmış, Açıklanmamış ve açıklanmış 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>


0

Mathematica 226 Bayt

Ekrana göre fare konumu ön uç tarafından izlenir ve fare hareket ettiğinde iletişim not defterinin pencere konumu taşınır. Oldukça basit, ancak komutlar, Mathematica'da olduğu gibi, harfler açısından çok uzundur. Tamam'ı tıklatmak iletişim kutusunu kapatır.

{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 Testi tamamladığınızda, ön uç seçeneğini kaldırmak için bunu çalıştırın.

SetOptions[$FrontEndSession,FrontEndEventActions->None]

ekran animasyonu


İşlevselliği kanıtlamak için bir gif ekleyebilir misiniz? Mathematica'yı test edemiyorum. Teşekkürler!
HyperNeutrino

-1

Javascript (ES6) + HTML + CSS, 139 bayt

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

Uyarı iletişim kutularını konumlandıramadığınız için özel süper süslü iletişimimi HTML olarak yaptım. Javascript, pencere nesnesine bir olay işleyicisi kaydeder ve konumu olayın koordinatlarına ayarlar.

Çevrimiçi deneyin: https://jsfiddle.net/1yohswje/


Bunun geçersiz olduğunu söyleyeceğim, çünkü meşru bir "pencere" ye benzer bir şey yaratmaz ve bunun bir düğmeli bir pencere olması gerektiğini de söyleyemezsiniz. Ancak, ilginç bir çözüm!
HyperNeutrino

@HyperNeutrino Cevabımı güncelledim. Bunun hakkında ne düşünüyorsun?
corvus_192

Tamam. Bu benim standartlara uygun. +1
HyperNeutrino
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.