2

私のタッチスクリーンキーボードは高度にカスタマイズ可能なインターフェイスであり、キーの送信を除いて必要なすべてのコンポーネントがあり、誰もがこれに問題を抱えています。もともと私がそれを作成していたとき、私はForms.SendKeys.Send()を使用するつもりでしたが、それはWPFアプリケーションです...行きません。初心者にとって、VB.Netはその無限の知恵で、デフォルトのフォームメッセージを処理しないことを決定しました。図に行きます。

または、これが私の本当の問題である可能性があります。WPFアプリケーションでフォーカスの取得を停止することはできません。Windowsタッチキーボードのように動作させたいのですが、透過的なWPFで発生するすべてのアクションにより、そのアプリケーションがアクティブになります。イベントを引き続き発生させたいのですが、アクティブなウィンドウは、メモ帳のように、入力したいウィンドウである必要があります。

WPFをフォーカスできないようにし、キーボードボタンをフォーカスされた(または他の)ウィンドウに送信するために、何をすべきかについての提案はありますか?

PS、Vb.NetのVisual Studio 2010でWPFを使用しています(C#コードを使用できます!)

4

1 に答える 1

3

私はあなたがここで答えが役に立つと思うと思います

これを達成するための複雑な方法はいくつかありますが、上記のリンクは簡単で、1つの癖しかなく、正直に言うと回避できるという解決策を提示しました。入力ウィンドウをドラッグすると、移動が完了するまでフィードバックは提供されませんが、クライアント以外のメッセージを処理することでこれを回避できます。必要に応じて回避策を検討することもできますが、最初にこの解決策が正しいことを確認してくださいあなたのために。

更新:上記のアプローチをWPFフォームに適用する方法のサンプル。

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Interop;
using System.Runtime.InteropServices;

namespace WpfApplication1
{
  /// <summary>
  /// Interaction logic for Window1.xaml
  /// </summary>
  public partial class Window1 : Window
  {
    public Window1()
    {
      InitializeComponent();
    }

    const int WS_EX_NOACTIVATE = 0x08000000;
    const int GWL_EXSTYLE = -20;

    [DllImport("user32", SetLastError = true)]
    private extern static int GetWindowLong(IntPtr hwnd, int nIndex);

    [DllImport("user32", SetLastError = true)]
    private extern static int SetWindowLong(IntPtr hwnd, int nIndex, int dwNewValue);

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
      WindowInteropHelper wih = new WindowInteropHelper(this);
      int exstyle = GetWindowLong(wih.Handle, GWL_EXSTYLE);
      exstyle |= WS_EX_NOACTIVATE;
      SetWindowLong(wih.Handle, GWL_EXSTYLE, exstyle);
    }    
  }
}
于 2010-05-19T20:03:30.437 に答える