2011-02-09 7 views
0

私の状況はかなり複雑ですが、私は他の人がこれを行うのを見てきました。残念ながら、私の具体的な問題は言及されていません。 私は、リボンを含むWPF UserControlをWin32ホストアプリケーションに統合しようとしています。これまでのところ、すべてがきちんときれいに働いていました(驚いたことに、さらに)。私は生のWin32子ウィンドウを作成し、これをWin32ホストのトップレベルウィンドウに埋め込むためにHwndSourceを使用しています。私は、TabControls、ボタン、RadioButtons、WebBrowsersとUserControl内のすべてを試してみて、それらはすべて私のWin32ホストアプリケーション内から使用可能です。もちろん、UserControlのグリッドの一番上の行にリボンコントロールがあります。HwndSource win32とリボンとキーチップの統合

は、ここで私がやっているものを基本的にです:これはかなり良い作品

mHwnd = new HwndSource (
    0, 0x40000000 | 0x10000000, 
    0, 
    left, 
    top, 
    width, 
    height, 
    "CIntegrationTest", 
    parentHandle); 
mUserCtrl = new UserControl1(); 
mHwnd.RootVisual = mUserCtrl; 

。 リボンの下にあるUserControl1に、他のコントロール(編集やいくつかのボタンなど)があります。キーボードフォーカスがこれらのコントロールのいずれかにあるとき、Alt +を使用してRibbonTabsのKeyTipsとその要素にアクセスできます。しかし、フォーカスがWPF UserControlの内部ではなく、Win32ホストからのコントロールである場合、ホットキーは機能しません。

私はホットキーの実装を見て、KeyTipService(RibbonControlsLibrary \ Microsoft \ Windows \ Controls \ KeyTipService.csにあります)というクラスがInputManager.Current.PostProcessInputとInputManager.Current.PreProcessInputを使用していることを確認しました。キーヒットのホットキーを操作します。

残念ながら、Win32アプリケーションから必要なキーイベントをどのようにリボンに転送することができるのか、私は全く考えていません。私は、転送する必要があるメッセージをどのように識別できるかも知らない。

ここで誰かが同じような問題に遭遇したか、WPFメッセージ処理に関するもう少し手がかりがあり、私に助けやヒントを与えることができます。

PS:私はここのWindows XP SP3上のVisual Studio 2010のプレミアムを実行していることだし、あなたがにWindowsフォームから未処理のキーイベントを渡すことができる必要があり、2010年10月からWPFのため

答えて

0

をマイクロソフトのリボンを使用していますWPFレイヤー。 OnKeyDown、OnKeyUp、その他必要なものをオーバーライドします。 Form1コントロールのいずれかがイベントを処理しない場合、KeyEventArgsのHandledプロパティはfalseになります。

Forms.KeyEventArgsをControls.KeyEventArgsに変換し、WPFレイヤーに渡すことができます。 Handledブール値をコピーしないようにしてください。さもなければあなたのWPFパーツはそれをまったく処理しません。 :)

アイデアを示すサンプルコードを添付しました。

public partial class Form1 : System.Windows.Forms.Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e) 
    { 
     base.OnKeyDown(e); 
     if (!e.Handled) 
     { 
      mUserCtrl.OnKeyDown(/* convert e into a Controls.KeyEventArgs and pass it */); 
     } 
    } 
} 
+0

私はWinForms interopではなくwin32 interop(HwndSource)クラスを使用しています。問題は、キーボードメッセージをInputManagerに正しく転送することができないことです。これは、リボンのKeyTip実装が使用するものです。 InputManager.ProcessInput()がありますが、期待どおりに動作しません。 –