2011-03-17 10 views
0

フレームアプリケーションを作成しました。これは親フォームとしてWindowsフォームアプリケーションです。起動すると、/ modulesにdllがあり、拡張モジュールとしてロードされます。そして、親フォームのmenuItemをクリックすると、特定のdllが動作します.DLLがフォームアプリケーションの場合、ショートカットを使用しようとすると表示されます(ビルドインのみです:CTRL-C ... )子フォームで、ホットキーが機能しません。なぜ誰に教えてください、どうすれば問題を解決できますか?私のコードは次のとおりです:子フォームでショートカットを有効にする方法

//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

ありがとうHans。私はすでにchildform.WhatにEnableShortcutsのプロッサーを設定しているだけで、Windowsのホットキー(ctr-c、ctrl-x、ctrl-v)は、ユーザー定義のホットキーではなく、機能します。コードスニペットを与えるのは、私が子供とMDIparentを接続するために醜く奇妙な方法を使うと思うからです。おそらく、問題が起こるからです。 – 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

ありがとうございます。あなたのコードの意図は何ですか? childformがkeydownイベントをキャッチすると、parentFormで定義されたイベントハンドラが呼び出されます。私はコードの要点を知るにはあまりにも鈍いと思う。 – user622851

+0

@ user622851:私はあなたがキーポイントを持っていると思います:「childformがkeydownイベントをキャッチすると、parentFormで定義されたイベントハンドラが呼び出されます」そうでなければ、keydown情報を親フォームにリレーする方法はないと思います。 ctr-c、ctrlxなどのショートカットを処理するkeydown情報を処理する必要がありますか? –

+0

ありがとう、私は試してフィードバックします。 – user622851

関連する問題