2011-03-17 62 views
0

我寫了一個框架應用程序,它是一個窗體應用程序作爲父窗體。當它啓動時,它會在/ modules中找到dll並將它們作爲擴展裝載。當我點擊父窗體中的menuItem時,具體的DLL會工作。如果DLL是一個表單應用程序,它會顯示。但是當我嘗試使用快捷鍵(只有內置插件,例如:CTRL-C ... )在childForm中,熱鍵不起作用。任何人都會告訴我爲什麼以及如何解決這個問題?這裏是我的代碼:如何在子窗體中啓用快捷方式

//parent.exe--ModuleEntrance.cs 
public abstract class ModuleEntrance { 
    public abstract string[] GetMenuNames(); 
    public abstract string[] GetMenuItemNames(); 
    public abstract EventHandler[] GetEventHandlers(); 
} 
//parent.exe--ParentForm.cs 
public partial class MDIParent : Form { 
    public MDIParent() { //CTOR 
    InitializeComponent(); 
    ModuleEntrance oneEntrance; 
    string oneMenuName, oneMenuItemName; 
    ToolStripMenuItem theMenu, theMenuItem; 
    for(){ //iterate dlls in /modules, if it implement ModuleEntrance, load it. 
      //And 1)load menu&menuItem. 
      //2) connect handler to menuItem.click through 
     //<code:theMenuItem.Click += new EventHandler(oneEntrance.GetEventHandlers()[i]);> 
    } 
} 

//-------------- 
//child.dll-- EntranceImp.cs //implement AC 
public class EntranceImp : ModuleEntrance { 
    public override string[] GetMenuNames() { 
    return new string[] { "MENU"}; 
    } 
    public override string[] GetMenuItemNames() { 
    return new string[] { "OpenChildForm"}; 
    } 
    public override EventHandler[] GetEventHandlers() { 
    return new EventHandler[]{ 
     (EventHandler)delegate(object sender, EventArgs e) { //Anonymous method 
     childForm form = new childForm(); 
     //find MDIparent and connect them 
     ToolStripMenuItem mi = (ToolStripMenuItem)sender; 
     form.MdiParent = (Form)(mi.OwnerItem.Owner.Parent); //It works! 
     form.Show(); 
     } 
    }; 
    } 
} 
//child.dll--childForm.dll 
//... 
+0

不工作的代碼不在代碼片段中。沒有對ShortcutKeys屬性進行賦值的符號。 –

+0

感謝漢斯。我已經在childform中設置了EnableShortcuts propers。我想要的只是讓windows內置熱鍵(ctr-c,ctrl-x,ctrl-v)工作,而不是用戶定義的熱鍵。我給代碼片斷,因爲我想我用一個醜陋和奇怪的方法來連接孩子和MDIparent.Maybe因爲這個,問題來了。 – user622851

+0

子窗體是否有熱鍵的事件處理程序,或者您希望父窗口能夠捕捉熱鍵嗎?如果您希望父窗體捕獲熱鍵,則需要將子項的關鍵事件中繼到父項或使用鉤子來捕獲按鍵(使用dllimport)。 –

回答

0

子窗體必須以某種方式通知父窗體關於按鍵事件。

一種方法是讓子窗體暴露父窗體可以偵聽的按下事件。請記住,每次更改子表單時都要移除父事件處理程序,否則最終會發生內存泄漏,因爲直到您釋放對它們的所有引用(包括事件處理程序)之前,對象纔會被垃圾回收。

class Parent 
{ 
    KeyEventHandler KeyDownHandler; 

    public Parent() 
    { 
     KeyDownHandler = new KeyEventHandler(form_TextBoxKeyDown); 
    } 

    void SetChildForm(Child form) 
    { 
     form.TextBoxKeyDown += KeyDownHandler; 
    } 

    void RemoveChildForm(Child form) 
    { 
     form.TextBoxKeyDown -= KeyDownHandler; 
    } 

    void form_TextBoxKeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Control) 
     { 
      switch (e.KeyCode) 
      { 
       case Keys.C: 

        break; 
       case Keys.X: 

        break; 
       case Keys.V: 

        break; 
      } 
     } 
    } 
} 

class Child 
{ 
    TextBox txtBox; 

    public event KeyEventHandler TextBoxKeyDown; 

    internal Child() 
    { 
     txtBox.KeyDown += new KeyEventHandler(txtBox_KeyDown); 
    } 

    void txtBox_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (TextBoxKeyDown != null) 
      TextBoxKeyDown(sender, e); 
    } 
} 
+0

Thanks.But我想知道你的代碼的意圖是什麼?當childform捕獲keydown事件時,它將調用parentForm中定義的事件處理程序。 en ....我想iam太無聊,不知道代碼的關鍵點。 – user622851

+0

@ user622851:我認爲你有一個關鍵點:「當childform catch keydown事件時,它會調用在parentForm中定義的事件處理程序」。我認爲沒有其他方法可以將keydown信息傳遞給父窗體。你想處理keydown信息來處理ctr-c,ctrlx等快捷方式,對吧? –

+0

非常感謝,我會盡力反饋。 – user622851