4

私はwin7で簡単な仮想キーボードを作成したい

| --- | --- | --- | 最初のブロックに9文字(abcdefgijk)

| --- | --- | --- |

| --- | --- | --- |

9つのボタンがあり、最初のボタンをクリックすると別のビューに変わります。

| --- | --- | --- |
 abc   
| --- | --- | --- |
 efg    
| --- | --- | --- |
 ijk

キーボードを押すと別のアプリケーションへのchar出力が生成されるように、ボタンをクリックする方法について混乱しています。使ってます

System.Windows.Forms.SendKeys.SendWait(sendString);

しかし、それは機能しません。sendStringはのように表示されるので、正しいことがわかりますConsole.WriteLine(sendString);

もう1つの質問は、ボタンをクリックしてもフォーカスがボタンに戻らないことです。

誰かがこのキーボードを実装する方法の解決策を持っていますか?

ありがとう!

返信ありがとうございます。実際、私はすでにそれらのコードを追加しています。ボタンを何度もクリックすると、問題も発生します。ボタンをクリックしてもフォーカスが機能せず、常にボタンにフォーカスします。このサンプルでは、​​2つのボタンが含まれています。それらのコードがエラーを見つけるのを手伝ってくれませんか。多くの人が考えています!

namespace WpfApplication5
{
    public partial class UserControl1 : UserControl
    {
        [DllImport("user32.dll")]
        public static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong);

        [DllImport("user32.dll", SetLastError = true)]
        public static extern UInt32 GetWindowLong(IntPtr hWnd, int nIndex);

        private IInputElement focusedInputElement;
        private Window parentWindow;
        private List<Button> keyCollection = new List<Button>();

        public UserControl1(Window parent)
        {
           this.parentWindow = parent;
           this.setupKeyboardControl();
        }

        public UserControl1(IInputElement elementToFocusOn)
        {
            // set focus
            this.focusedInputElement = elementToFocusOn;
            // setup this control
            this.setupKeyboardControl();
        }

        private void setupKeyboardControl()
        {
            InitializeComponent();
            // add all keys to internal collection
            this.addAllKeysToInternalCollection();
            // install clicks
            this.installAllClickEventsForCollection(this.keyCollection);
        }

        private void addAllKeysToInternalCollection()
        {
            // itterate all panels
            // itterate all buttons
            // add to list
            Console.WriteLine("Run at here"); 
            this.keyCollection.Add(A);
            this.keyCollection.Add(B);
        }

        /// <summary>
        /// Install click events for all keys in a collection
        /// </summary>
        /// <param name="keysToInstall"></param>
        private void installAllClickEventsForCollection(List<Button> keysToInstall)
        {
            // itterate all
            foreach (Button buttonElement in keysToInstall)
            {
                // install click event
                buttonElement.Click += new RoutedEventHandler(buttonElement_Click);
            }
        }

        /* private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.A)
               A.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
            else if (e.Key == Key.B)
               B.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
        }*/

        void buttonElement_Click(object sender, RoutedEventArgs e)
        {
            // create variable for holding string
            String sendString = "";

            try
            {
                // stop all event handling
                e.Handled = true;

                // set sendstring to key
                sendString = ((Button)sender).CommandParameter.ToString();

                // if something to send
                if (!String.IsNullOrEmpty(sendString))
                {
                    // if sending a string
                    if (sendString.Length > 1)
                    {
                        // add {}
                        sendString = "{" + sendString + "}";
                    }

                    // if a focusable element has been specified
                    if (this.focusedInputElement != null)
                    {
                        Console.WriteLine("1",sendString);
                        // set keyboard focus
                        Keyboard.Focus(this.focusedInputElement);
                        // set normal focus
                        this.focusedInputElement.Focus();
                    }

                    // send key to simulate key press
                   // System.Windows.Forms.SendKeys.Send(sendString);

                   System.Windows.Forms.SendKeys.SendWait(sendString);
                    Console.WriteLine(sendString);

                }
            }
            catch (Exception)
            {
                // do nothing - not important for now
                Console.WriteLine("Could not send key press: {0}", sendString);
            }
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            // if we have specified a parent
            if (this.parentWindow != null)
            {
                // Get this window's handle
                IntPtr HWND = new WindowInteropHelper(this.parentWindow).Handle;
                Console.WriteLine("Run in UserControl load");
                // style of window?
                int GWL_EXSTYLE = (-20);
                // get - retrieves information about a specified window
                GetWindowLong(HWND, GWL_EXSTYLE);
                // set - changes the attribute of a specified window - I think this stops it being focused on
                SetWindowLong(HWND, GWL_EXSTYLE, (IntPtr)(0x8000000));
            }
        }
    }
}
4

1 に答える 1

0

これを行う最も信頼できる方法は、Win32 API を使用することです。

[DllImport("user32.dll")]
public static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);

[DllImport("user32.dll", EntryPoint = "SendInput")]
public static extern uint SendInput(uint nInputs, InputKeys[] inputs, int cbSize);

CodePlex の動作中のアプリケーションでやりたいことの良い例があります

http://wosk.codeplex.com/

于 2012-04-12T09:21:20.400 に答える