Toon posts:

[C#] keyboard input 'application wide' krijgen in MDI app

Pagina: 1
Acties:
  • 673 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hey,

Is het mogelijk om in C# in een MDI applicatie de keyboard input 'application wide' te krijgen?
Nu is het zo dat bijvoorbeeld een KeyPress event, alleen werkt als het MDI child form focus heeft. Dus; hoe kan ik keyboard input acties in alle forms (ook de mdiParent) binnen krijgen, zodat ik per form events kan maken?

(hopelijk heb ik het duidelijk genoeg uitgelegd :))

[ Voor 3% gewijzigd door Verwijderd op 04-06-2005 16:14 ]


  • BestTested!
  • Registratie: Oktober 2003
  • Laatst online: 00:02
Kan je niet een hotkey de toetsen afvangen? Ik programmeer zelf geen C# dus misschien bazel ik.

  • whoami
  • Registratie: December 2000
  • Laatst online: 06-05 15:36
Een form heeft een 'KeyPreview' property. Als je die op 'True' zet, dan worden alle key-strokes die op de controls binnen dat form gebeuren, naar de form zelf gestuurd.
Echter, ik weet niet of het wel dat is dat je bedoelt ?

Of bedoel je dat alle forms die je open staan hebt, op zo'n keystroke moeten reageren ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ja, ik heb een aantal child forms (multiple instances) die je aan moet kunnen sturen via F1/F2/F3/etc. dus daarom moet de keyboard input op alle forms binnen komen, ipv alleen op het focused-form..

Ik zal vanavond eens naar de KeyPreview kijken, of dat is wat ik zoek.

Verwijderd

Topicstarter
Zo, ik heb er even mee gespeelt, maar KeyPreview lijkt niet de oplossing..

Iemand nog suggesties? Lijkt me toch dat het mogelijk moet zijn..

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Is het niet mogenlijk om je MdiParent de input op te laten vangen en zelf door te laten sturen naar je child controls. Of als je alleen de selectie van de childs er mee wilt regelen dit gewoon door je MdiParent te laten doen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
rwb schreef op woensdag 08 juni 2005 @ 09:20:
Is het niet mogenlijk om je MdiParent de input op te laten vangen en zelf door te laten sturen naar je child controls. Of als je alleen de selectie van de childs er mee wilt regelen dit gewoon door je MdiParent te laten doen.
Daar had ik ook al aan gedacht, maar wanneer er MDIchilds zijn, krijgt de parent de input niet meer binnen.. dus dat gaat niet op..

Ik kan wel een verborgen mainMenu maken met keyboard shortcuts, en die via een gedeelde class doorspelen.. maar dat is zo omslachtig en riskant, dus daar gaat mijn voorkeur niet naar uit.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je kan je MdiParent toch gewoon een eventhandler laten registreren voor het KeyDown event op al zijn MdiChilds? Je krijgt dan volgens mij alle KeyDown events gewoon binnen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Heb zojuist even een test applicatie gebouwd met twee forms:
MDIContainerForm.cs
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace MDITest
{
    public class MDIContainerForm : System.Windows.Forms.Form
    {
        private System.ComponentModel.Container components = null;

        public MDIContainerForm()
        {
            InitializeComponent();
        }

        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        private void InitializeComponent()
        {
            // 
            // MDIContainerForm
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.BackColor = System.Drawing.SystemColors.ControlDark;
            this.ClientSize = new System.Drawing.Size(456, 309);
            this.IsMdiContainer = true;
            this.KeyPreview = true;
            this.Name = "MDIContainerForm";
            this.Text = "MDI Container";
            this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.MDIContainerForm_KeyPress);

        }
        #endregion

        private void MDIContainerForm_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            if(char.IsNumber(e.KeyChar))
            {
                foreach(MDIChildForm f in this.MdiChildren)
                    if(f.Tag.Equals(int.Parse(e.KeyChar.ToString())))
                    {
                        this.ActivateMdiChild(f);
                        f.BringToFront();
                        e.Handled = true;
                        break;
                    }
            }
            else if(e.KeyChar.ToString().ToUpper()=="N")
            {
                int count = 0;
                foreach(MDIChildForm c in this.MdiChildren)
                    count++;
                MDIChildForm f = new MDIChildForm();                
                f.Tag = count+1;
                f.MdiParent = this;
                f.Visible = true;
                this.ActivateMdiChild(f);               
                e.Handled = true;
            }
        }

        [STAThread]
        static void Main() 
        {
            Application.Run(new MDIContainerForm());
        }
    }
}

MDIChildForm.cs
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace MDITest
{
    public class MDIChildForm : System.Windows.Forms.Form
    {
        private System.Windows.Forms.TextBox textBox1;

        private System.ComponentModel.Container components = null;

        public MDIChildForm()
        {
            InitializeComponent();
        }

        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if(components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        private void InitializeComponent()
        {
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.SuspendLayout();
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(64, 72);
            this.textBox1.Name = "textBox1";
            this.textBox1.TabIndex = 0;
            this.textBox1.Text = "textBox1";
            // 
            // MDIChildForm
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 273);
            this.Controls.Add(this.textBox1);
            this.Name = "MDIChildForm";
            this.Text = "MDIChildForm";
            this.ResumeLayout(false);

        }
        #endregion
    }
}

Met de N toets wordt een nieuwe MDI child gecreeerd en met de toetsen 1 tot 9 kun je de diverse formulieren selecteren. Works like a charm!

Verwijderd

Ik heb een tijdje geleden het een en ander in elkaar genutseld met php-gtk. Omdat daar natuurlijk enige vorm van fatsoenlijke key-events ontbrak heb ik met wat windows api calls (meer specifiek: int GetAsyncKeyState (long vKey) uit user32.dll) key events opgehaald. Als je echt niks meer weet kun je zoiets natuurlijk nog proberen :P.

Verwijderd

Topicstarter
Het gaat niet om windowtjes selecteren :)

Ik zal het even een beetje uitleggen.. ik heb audio-playertjes (soort mp3 spelertjes). Daarvan kun je er zoveel openen als je wilt, binnen het MDIParent. Automatisch krijgt dan elke player een nummer. B.v. 1, 2, 3. Ik wil nu dus de key-input binnen krijgen op alle childs, zodat bijvoorbeeld F2 ingedrukt wordt, mp3-player 2 start. Daarvoor moet het dus niet uitmaken of het MDI child form active is of niet..

Maar ik heb het voor elkaar :)

KeyPress blijkt niet de systeem-toetsen (F keys) door te spelen.. KeyDown werkt wel goed :)
Pagina: 1