Form megnyitása az összes képernyőn
2020-12-13T01:44:44+01:00
2020-12-13T18:13:36+01:00
2022-07-19T00:50:56+02:00
ShadowMember
Hello
Éppen csinálok egy alkalmazást amely segitené a szülőket és a gyerekeket, hogy ne üljenek sokat a gépen és csinálják a házi feladatukat vagy/és játszani más gyerekekkel (testvér, barát).
A mai világban az internetről szól minden és a gyerekek nem tudják mennyi az elég.

Azt akarom, hogy amikor lejár az idejük akkor megjelenjen egy form vagy 2 form hogy lejárt az idejük. Ha több időt akarnak akkor a szülőket kell kérdezni, ha nem kapnak időt akkor nem tudják tovább használni a gépet.
Nos a legnagyobb probléma az, hogy egy fekete átlátszó form-al akarom eltakarni a képernyőt hogy ne tudjanak sehova se kattintani és a primary képernyőn jelenne meg a kérés ablak.
Ami van jelenleg most kódom, az minden esetben csak is a primary képernyőn megy vagyis az elsődleges gépernyőn és nem fedi le a második és a többi képernyőt, igy pedig a gyerkőcök tovább tudnak játszani a gépen vagy mást csinálni a második képernyőn.

Legjobb esetben le kellene fedjem a többi képernyőt is a fekete átlátszó form-al, igy nem tudnának más képernyőn se kattintani össze-vissza.

A kódom elsőre igy volt:

Bitmap bmp = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height); using (Graphics G = Graphics.FromImage(bmp)) { G.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver; G.CopyFromScreen(this.PointToScreen(new Point(0, 0)), new Point(0, 0), this.ClientRectangle.Size); double percent = 0.60; Color darken = Color.FromArgb((int)(255 * percent), Color.Black); using (Brush brsh = new SolidBrush(darken)) { G.FillRectangle(brsh, this.ClientRectangle); } } // put the darkened screenshot into a Panel and bring it to the front: using (Panel p = new Panel()) { p.Location = new Point(0, 0); p.Size = this.ClientRectangle.Size; p.BackgroundImage = bmp; this.Controls.Add(p); p.BringToFront(); // display your dialog somehow: TimeEndedForm timended = new TimeEndedForm(); timended.Show(); }



Utána megpróbáltam ezzel:

Bitmap bmp = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height); using (Graphics G = Graphics.FromImage(bmp)) { G.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver; G.CopyFromScreen(this.PointToScreen(new Point(0, 0)), new Point(0, 0), this.ClientRectangle.Size); double percent = 0.60; Color darken = Color.FromArgb((int)(255 * percent), Color.Black); using (Brush brsh = new SolidBrush(darken)) { G.FillRectangle(brsh, this.ClientRectangle); } } // put the darkened screenshot into a Panel and bring it to the front: using (Panel p = new Panel()) { int height = 0; int width = 0; foreach (Screen screen in Screen.AllScreens) { //take smallest height height = (screen.Bounds.Height <= height) ? screen.Bounds.Height : height; width += screen.Bounds.Width; } p.Location = new Point(0, 0); this.Size = new Size(width, height); // p.Size = this.ClientRectangle.Size; p.Size = new Size(width, height); p.BackgroundImage = bmp; this.Controls.Add(p); p.BringToFront(); // display your dialog somehow: TimeEndedForm timended = new TimeEndedForm(); timended.Show(); }

Mind a képt módszer a form load eventbe folt berakva és mind a két módszer ugyanazt az eredményt adta, semmi különbség nem volt. Az eredmény pedig hogy elsődleges képernyőn jelenik meg a fekete átlátszó form és nem pedig az összes képernyőn.

Hogy tudom megcsinálni, hogy az összes képernyőn jelenjen meg?
Mutasd a teljes hozzászólást!
Ok, megoldva.
Ha valaki hasonló alkalmazást akar csinálni akkor remélem azoknak is működni fog ez a módszer.
Nekem működik. Ma sikerült kijátszanom ezt is, 1 hét után. =))

private static Rectangle GetDesktopBoundse(Form main) { Rectangle result = new Rectangle(); for (int i = 0; i < Screen.AllScreens.Length; i++) { Screen screen = Screen.AllScreens
; result = Rectangle.Union(result, screen.Bounds); } main.Top = result.Top; main.Left = result.Left; main.Width = result.Width; main.Height = result.Height; return result; }


Mutasd a teljes hozzászólást!

  • Szia!

    Bocs, nincs előttem épp fejlesztő eszköz, így csak az elveket tudom leírni.
    A több képernyőt úgy kell elképzelni, mintha egy kiterjesztett, nagyobb méretű kijelződ lenne, amiből a több képernyő egyszerűen kimetsz egy darabot.
    Ennek a nagyobb - virtuális - ablaknak a 0.0 koordinátája a főablak bal felső sarka. Előfordulhat emiatt az is, hogy a virtuális ablak bal felső sarkának koordinátái negatív értékek!
    Meg kellene találnod ennek a virtuális ablakn a bal felső és a jobb alsó sarkának a koordinátáját, majd a paneledet ezekre a méretekre és pozíciókra kellene állítanod.

    Gábor
    Mutasd a teljes hozzászólást!
  • Nem tudok válaszolni, úgyhogy valószínűleg OFF.
    A te megoldásod gyakorlatilag az lenne, hogy eltakarod a képernyőt... akármeddig is jutsz el, ez csak további tákolás lesz sajnos (pl. bill. kombinációk tiltása: Win gomb, ALT+F4, ALT+TAB, CTRL+ALT+DEL, SHIFT+CTRL+ESC... stb.).

    Szerintem ezt inkább fiók szinten kellene menedzselni.
    A windows amúgy nem tartalmaz "parental control" feature-t?
    Mutasd a teljes hozzászólást!
  • A windowsnak van, de sokszor nem is aktiválódik, hanem hagyja a gyereket menni veszélyes weboldalakra és nem is tiltja le a használatot például este 8-kor.
    A billentyű letiltás az ok, csak ez a lefedés bonyolult nekem.

    @glakotos uhh, annyira pro nem vagyok programozásban. Haladó fokozaton vagyok de nem pro, hogy ennyire értsem. :P
    Mutasd a teljes hozzászólást!
  • Próbáltam @glakotos módszerével. Most mutatja a méretet rendesen, de viszont a form nem akar kinyújtózni arra a méretre.
    Egy labelbe kiraktam hogy mekkora képernyő méretet észlel és az egyezik.

    Erre a kódra változtattam meg, de az eredmény még most is úgyanaz. Csak az elsődleges képernyőre megy, nem pedig mindegyikre.

    private void Background_Load(object sender, EventArgs e) { Rectangle desktopRect = GetDesktopBoundse(); Bitmap bmp = new Bitmap(desktopRect.Width, desktopRect.Height); using (Graphics G = Graphics.FromImage(bmp)) { G.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver; G.CopyFromScreen(this.PointToScreen(new Point(0, 0)), new Point(0, 0), desktopRect.Size); double percent = 0.60; Color darken = Color.FromArgb((int)(255 * percent), Color.Black); using (Brush brsh = new SolidBrush(darken)) { G.FillRectangle(brsh, desktopRect); } } // put the darkened screenshot into a Panel and bring it to the front: using (Panel p = new Panel()) { TopLevel = true; Size = new Size(desktopRect.Width, desktopRect.Height); p.Location = desktopRect.Location; //p.Size = this.ClientRectangle.Size; p.Size = desktopRect.Size; p.BackgroundImage = bmp; this.Controls.Add(p); p.BringToFront(); // display your dialog somehow: TimeEndedForm timended = new TimeEndedForm(); timended.TopMost = true; timended.Show(); } } private static Rectangle GetDesktopBoundse() { Rectangle result = new Rectangle(); for (int i = 0; i < Screen.AllScreens.Length; i++) { Screen screen = Screen.AllScreens
    ; result = Rectangle.Union(result, screen.Bounds); } return result; }


    Mutasd a teljes hozzászólást!
  • Ok, megoldva.
    Ha valaki hasonló alkalmazást akar csinálni akkor remélem azoknak is működni fog ez a módszer.
    Nekem működik. Ma sikerült kijátszanom ezt is, 1 hét után. =))

    private static Rectangle GetDesktopBoundse(Form main) { Rectangle result = new Rectangle(); for (int i = 0; i < Screen.AllScreens.Length; i++) { Screen screen = Screen.AllScreens
    ; result = Rectangle.Union(result, screen.Bounds); } main.Top = result.Top; main.Left = result.Left; main.Width = result.Width; main.Height = result.Height; return result; }


    Mutasd a teljes hozzászólást!
abcd