Entwickler-Ecke

Basistechnologien - CallBackOnCollectedDelegate wurde gefunden!


Hm... - Do 26.03.09 23:07
Titel: CallBackOnCollectedDelegate wurde gefunden!
Hallo, ich habe ein Problem. Und zwar habe ich Globale Hooks in meinem Programm. Diese werden mit dieser [http://www.codeproject.com/KB/cs/CSLLKeyboardHook.aspx] Klasse erstellt. Wenn ich jedoch auf einen Button klicke und dann irgendeine Taste drücke, bekomme ich eine "CallBackOnCollectedDelegate wurde gefunden!"-Meldung. Woran liegt das? Hier der Code:

C#-Quelltext
1:
2:
3:
        public bool IsActive = false
        ...
        globalKeyboardHook gkh = new globalKeyboardHook();


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
        private void Form1_Load(object sender, EventArgs e)
        {
            ...
            gkh.HookedKeys.Add(Keys.F1);
            gkh.HookedKeys.Add(Keys.F2);
            gkh.HookedKeys.Add(Keys.F3);
            gkh.HookedKeys.Add(Keys.F4);
            gkh.HookedKeys.Add(Keys.F5);
            gkh.HookedKeys.Add(Keys.F6);
            gkh.HookedKeys.Add(Keys.F7);
            gkh.HookedKeys.Add(Keys.F8);
            gkh.HookedKeys.Add(Keys.F9);
            gkh.HookedKeys.Add(Keys.F10);
            gkh.HookedKeys.Add(Keys.F11);
            gkh.HookedKeys.Add(Keys.F12);
            gkh.KeyDown += new KeyEventHandler(gkh_KeyDown);
            gkh.KeyUp += new KeyEventHandler(gkh_KeyUp);
            ...
        }


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
        private void button2_Click(object sender, EventArgs e)
        {
            if (string.Equals(button2.Text, "Hotkeys aktivieren"))
            {
                button2.Text = "Hotkeys deaktivieren";
                IsActive = true;
            }
            else
            {
                button2.Text = "Hotkeys aktivieren";
                IsActive = false;
            }
        }


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
        void gkh_KeyUp(object sender, KeyEventArgs e)
        {
                if (e.KeyCode == Keys.F1 && IsActive)
                {
                    F1.Send();
                    e.Handled = true;
                }
                if (e.KeyCode == Keys.F2)
                {
                    F2.Send();
                    e.Handled = true;
                }
                ... //Geht dann genauso gleich bis F12 weiter
        }

Jemand eine Idee? Liegt's an der Klasse oder eher an mir?

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Th69 - Fr 27.03.09 11:23

Scheint das selbe Problem zu sein wie bei http://www.codeproject.com/KB/cs/CSLLKeyboardHook.aspx?fid=423705&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26&select=2143152#xx2143152xx
d.h. man muß verhindern, daß der GC die Instanz löscht.

Die Lösung scheint die Änderung des Original-Source-Codes zu sein:
http://www.codeproject.com/KB/cs/CSLLKeyboardHook.aspx?fid=423705&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26&select=2183087#xx2183087xx