none
Windows 10 da seçilmiş olan yüzdelik uygulama boyutu kod ile öğrenilir mi? RRS feed

  • Soru

  • Merhabalar,

    Ekran ayarları sayfasında

    Metin, uygulama ve diğer öğelerin boyutunu değiştir. seçilen değeri kod ile nasıl bulabilirim.

    kendi bilgisayarımın ekranındaki uygulamaların ne kadar oranda büyüdüğünü öğrenmek istiyorum.

    bu oranı öğrendikten sonra inşallah windows form sorunsuz bir şekilde bütün ekranlarda çalışacaktır.


    Yardımlarınız için Şimdiden Teşekkür Ederim.





    • Düzenleyen HakanÇtn 6 Aralık 2019 Cuma 03:01 Anlatım Düzeltildi
    3 Aralık 2019 Salı 18:40

Tüm Yanıtlar

  • HakanÇtn Bey, 

    Yapmak istediğiniz  değişikliği kendi bilgisayarınız uzerinde mi veya AD üzerinden başka makinelere "role" olarak mi ?

    Sorunuz biraz eksik...


    Birinin cevabı size yardımcı oldu ise, lütfen "Yanıt Olarak Öner" veya "Yanıt Olarak İşaretle" olarak işaretlemeyi ve "Oy" vermeyi unutmayınız. Burada sağlanan tüm görüşler, kişiseldir ve Microsoft'un konumunu temsil etmemektedir. Tüm bilgiler hazır olarak temin edilmektedir ve herhangi bir garanti vermemektedir.

    4 Aralık 2019 Çarşamba 15:05
    Moderatör
  • kendi bilgisayarımdaki ekranın sadece bu ayarını 

    büyültme oranını öğrendikten sonra windows form inşallah sorunsuz bir şekilde bütün ekranlarda çalışacaktır. formun ekran boyutuna göre ayarlamanın büyük bir kısmını çözdüm çözülmesi gereken tek bu ayar kaldı. nasıl öğrenebilirim?

    Yardım etmeye çalıştığınız için teşekkür ederim.




    • Düzenleyen HakanÇtn 6 Aralık 2019 Cuma 04:04
    5 Aralık 2019 Perşembe 19:01
  • Resolution ve scaling gibi konularla çalıştığında göre gündeminde resposive bir uygulama geliştirme yaklaşımı var ancak WinForm bu konuda oldukça can sıkıcı bir teknoloji. Yanlış bir yolda olduğunu söylemiyorum ama WPF/UWP gibi teknolojilere geçmenin zamanıdır bence. WPF ile Bootstrap (bir CSS framework) gibi rahatça çalışabilirsin.

    Aradığın şey tam olarak Scale Factor ama yolu DPI'dan geçiyor. Aşağıda birkaç kod verip mantığını kavramaya çalışalım.

    ScreenExtensions.cs adında bir class olsun;

    public static class ScreenExtensions
    {
        public static void GetDpi(this Screen screen, DpiType dpiType, out uint dpiX, out uint dpiY)
        {
            var pnt = new System.Drawing.Point(screen.Bounds.Left + 1, screen.Bounds.Top + 1);
            var mon = MonitorFromPoint(pnt, 2/*MONITOR_DEFAULTTONEAREST*/);
            GetDpiForMonitor(mon, dpiType, out dpiX, out dpiY);
        }
    
        // https://msdn.microsoft.com/en-us/library/windows/desktop/dd145062(v=vs.85).aspx
        [DllImport("User32.dll")]
        private static extern IntPtr MonitorFromPoint([In]System.Drawing.Point pt, [In]uint dwFlags);
    
        // https://msdn.microsoft.com/en-us/library/windows/desktop/dn280510(v=vs.85).aspx
        [DllImport("Shcore.dll")]
        private static extern IntPtr GetDpiForMonitor([In]IntPtr hmonitor, [In]DpiType dpiType, [Out]out uint dpiX, [Out]out uint dpiY);
    }

    görüldüğü üzere GetDpi adında bir extension metodumuz var, bununle seçilen monitörün dpi bilgisini alacağız.

    DpiType enum'ını da unutmamak lazım;

    // https://msdn.microsoft.com/en-us/library/windows/desktop/dn280511(v=vs.85).aspx
    public enum DpiType
    {
        Effective = 0,
        Angular = 1,
        Raw = 2,
    }


    GetScaleFactor adında bir metod ile dpi'dan scale factor değerini alalım;

    // https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/dpi-related-apis-and-registry-settings
    public int GetScaleFactor(uint dpi)
    {
        switch (dpi)
        {
            case 96 : 
                return 100;
            case 120:
                return 125;
            case 144:
                return 150;
            case 192:
                return 200;
            default:
                return 0;
        }
    }
    


    Örnekteki değerler sabit değil sanırım ki şurada farklı işletim sistemi, panel, çözünürlük ve ich gibi değişkenler de söz konusu olduğunu da göz önünde bulundurmalı.

    Şimdi birincil ekranın %'lik değerini alalım;

    var primaryScreen = System.Windows.Forms.Screen.PrimaryScreen;
    
    primaryScreen.GetDpi(DpiType.Effective, out uint x);
    
    MessageBox.Show($"{GetScaleFactor(x)}%");

    Konu hakkında çok detaylı bilgim olmadığı için bu örneğe örnek gözüyle bakmanda fayda var :).

    Kaynakhttps://stackoverflow.com/a/29463627/6940144 (asıl örnekte birden fazla monitör ele alınmış)


    TR| Sorunuzun yanıtı bu ise "Yanıt Olarak Öner" olarak işaretleyin, eğer faydalı bir yorum ise "Oy Ver"erek forumun işleyişine katkıda bulunabilirsiniz. EN| If this is the answer to your problem, mark "Propose as Answer" and if it is helpful, you can contribute to the workig of the forum by "Voting".

    6 Aralık 2019 Cuma 05:25
  • Resolution ve scaling gibi konularla çalıştığında göre gündeminde resposive bir uygulama geliştirme yaklaşımı var ancak WinForm bu konuda oldukça can sıkıcı bir teknoloji. Yanlış bir yolda olduğunu söylemiyorum ama WPF/UWP gibi teknolojilere geçmenin zamanıdır bence. WPF ile Bootstrap (bir CSS framework) gibi rahatça çalışabilirsin.

    Aradığın şey tam olarak Scale Factor ama yolu DPI'dan geçiyor. Aşağıda birkaç kod verip mantığını kavramaya çalışalım.

    ScreenExtensions.cs adında bir class olsun;

    public static class ScreenExtensions
    {
        public static void GetDpi(this Screen screen, DpiType dpiType, out uint dpiX, out uint dpiY)
        {
            var pnt = new System.Drawing.Point(screen.Bounds.Left + 1, screen.Bounds.Top + 1);
            var mon = MonitorFromPoint(pnt, 2/*MONITOR_DEFAULTTONEAREST*/);
            GetDpiForMonitor(mon, dpiType, out dpiX, out dpiY);
        }
    
        // https://msdn.microsoft.com/en-us/library/windows/desktop/dd145062(v=vs.85).aspx
        [DllImport("User32.dll")]
        private static extern IntPtr MonitorFromPoint([In]System.Drawing.Point pt, [In]uint dwFlags);
    
        // https://msdn.microsoft.com/en-us/library/windows/desktop/dn280510(v=vs.85).aspx
        [DllImport("Shcore.dll")]
        private static extern IntPtr GetDpiForMonitor([In]IntPtr hmonitor, [In]DpiType dpiType, [Out]out uint dpiX, [Out]out uint dpiY);
    }

    görüldüğü üzere GetDpi adında bir extension metodumuz var, bununle seçilen monitörün dpi bilgisini alacağız.

    DpiType enum'ını da unutmamak lazım;

    // https://msdn.microsoft.com/en-us/library/windows/desktop/dn280511(v=vs.85).aspx
    public enum DpiType
    {
        Effective = 0,
        Angular = 1,
        Raw = 2,
    }


    GetScaleFactor adında bir metod ile dpi'dan scale factor değerini alalım;

    // https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/dpi-related-apis-and-registry-settings
    public int GetScaleFactor(uint dpi)
    {
        switch (dpi)
        {
            case 96 : 
                return 100;
            case 120:
                return 125;
            case 144:
                return 150;
            case 192:
                return 200;
            default:
                return 0;
        }
    }


    Örnekteki değerler sabit değil sanırım ki şurada farklı işletim sistemi, panel, çözünürlük ve ich gibi değişkenler de söz konusu olduğunu da göz önünde bulundurmalı.

    Şimdi birincil ekranın %'lik değerini alalım;

    var primaryScreen = System.Windows.Forms.Screen.PrimaryScreen;
    
    primaryScreen.GetDpi(DpiType.Effective, out uint x);
    
    MessageBox.Show($"{GetScaleFactor(x)}%");

    Konu hakkında çok detaylı bilgim olmadığı için bu örneğe örnek gözüyle bakmanda fayda var :).

    Kaynakhttps://stackoverflow.com/a/29463627/6940144 (asıl örnekte birden fazla monitör ele alınmış)


    TR| Sorunuzun yanıtı bu ise "Yanıt Olarak Öner" olarak işaretleyin, eğer faydalı bir yorum ise "Oy Ver"erek forumun işleyişine katkıda bulunabilirsiniz. EN| If this is the answer to your problem, mark "Propose as Answer" and if it is helpful, you can contribute to the workig of the forum by "Voting".

    Güzel ama GetScaleFactor bildiğin doğru orantı, switch biraz gereksiz olmuş.

    www.cihanyakar.com

    6 Aralık 2019 Cuma 10:22