2017-06-14 8 views
1

に私は、そのIDがIDC_EDITCONTROL_AIDC_EDITCONTROL_Bであり、それぞれm_editControlAm_editControlB、として定義された変数を有する2エディットコントロールと対話MainDialog.cppを作成しました。シミュレーションキーボード入力はC++ MFCアプリ

はまた、私は、そのIDがIDC_MFCBUTTON_KEY_XIDC_MFCBUTTON_KEY_Yある2ボタンを持っている、との変数は、それぞれm_buttonKeyXm_buttonKeyY、です。以下は

は私が選択したエディットコントロールに、それぞれの文字(この例では、すなわち Xまたは Y)を送信 各ボタンを持つことができる方法を理解しようとしています

#include "afxdialogex.h" 

IMPLEMENT_DYNAMIC(CMainDialog, CDialogEx) 

CMainDialog::CMainDialog(CWnd* pParent): CDialogEx(IDD_MAIN_DIALOG, pParent) 
{ 
} 

CMainDialog::~CMainDialog() 
{ 
} 

void CMainDialog::DoDataExchange(CDataExchange* pDX) 
{ 
    CDialogEx::DoDataExchange(pDX); 

    DDX_Control(pDX, IDC_EDITCONTROL_A, m_editControlA); 
    DDX_Control(pDX, IDC_EDITCONTROL_B, m_editControlB); 
    DDX(Control(pDX, IDC_MFCBUTTON_KEY_X, m_buttonKeyX); 
    DDX(Control(pDX, IDC_MFCBUTTON_KEY_Y, m_buttonKeyY); 
} 

BEGIN_MESSAGE_MAP(CMainDialog, CDialogEx) 
    ON_EN_CHANGE(IDC_EDITCONTROL, &CMainDialog::OnEnChangeEditA) 
    ON_BN_CLICKED(IDC_MFCBUTTON_KEY_X, &CMainDialog::OnBnClickedButtonX) 
    ON_BN_CLICKED(IDC_MFCBUTTON_KEY_Y, &CMainDialog::OnBnClickedButtonY) 
END_MESSAGE_MAP() 

void CMainDialog::OnBnClickedButtonX() 
{ 
    m_editControlA.SetWindowTextW(_T("X")); // test 
} 

void CMainDialog::OnBnClickedButtonX() 
{ 
    m_editControlA.SetWindowTextW(_T("Y")); // test 
} 

ソースファイル内のコードですが選択されている場合はです。本質的には、私はキーボード入力をシミュレートしたい

私はhow to simulate keyboard eventsとさらにsendMessageについてのドキュメントを読んだことがありますが、C++の知識は非常に基本的なので、実装方法を理解できませんでした。また、私のprevious questionに続いて、GetFocusが役に立つと思っていますが、依然として私の主な問題は現在入力を送信しています。

どのようなコードや役に立つリンクがあれば、アプリ内でのキーボード入力をどのようにシミュレートできるかを知る上で非常に役立ちます。

+0

問題は、ボタンを押したときに編集コントロールがフォーカスを失うことです。以前の質問のコメント作成者は、これを解決する方法をいくつか提案しました。もう一つの考え方は、ボタンを 'SS_NOTIFY'スタイルの静的コントロールで置き換えることです。統計はデフォルトでフォーカスを受けません。 – zett42

+0

キーボードイベントをシミュレートするのはおそらく間違った方法です。あなたは実際に解決しようとしている問題はどれですか?これは[XY問題](http://xyproblem.info/)のように見えます –

答えて

2

文字は、OSからWM_CHARメッセージを使用して編集コントロールに送信されます。

実際にはそれより少し複雑ですが、最終結果はWM_CHARメッセージを生成するため、WM_KEYUP WM_KEYDOWNメッセージシーケンス全体をエミュレートする必要はありません。

フォーカスがない場合でも、CWnd :: PostMessageを使用して、編集コントロールに直接文字を送信できます。あなたはおそらくすでにここWM_CHARの文書を発見した

https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms646276(v=vs.85).aspx

おっと...私のフランス語を言い訳に、THS英語のドキュメントはここ https://msdn.microsoft.com/en-us/library/windows/desktop/ms646276(v=vs.85).aspx

である(ちょうどEN-USにFR-FRのない変更トリックは、それはおそらくきちんとし、他のすべての言語のために働く!

  • がwParamにを送信したい文字を保持している。どちらのプレーンASCII文字、またはVK_定数のいずれか...私はあなたがユニコードのバージョンWM_CHARWを使用することをお勧めします。ほとんどのWindowsソフトウェアは現在ユニコードを使用しています。ワイド文字の表記は、L'X 'または_T(' X ')、Unicode(UTF-16)文字タイプはwchar_tです。

  • lParamには他のキーストロークの詳細が含まれていますが、0はあなたがしたいことに対してうまくいくはずです。Xを送信するために

、括弧の間_T()の表記、文字(または文字列)リテラルを使用する場合は、単に

m_editControlA.PostMessage(WM_CHAR, _T('X')); 

を呼び出し、自動的にアプリのための右の文字幅に変換されますユニコード設定(UNICODEに設定する必要があります。これは、OSが使用しているもので、Windows CEの唯一の有効なエンコーディングでもありますので、このタイプの操作に慣れる必要があります)。

_TほぼすべてのCライブラリ関数のマクロと_t *オーバーライド文字列での操作はtchar.hで定義されています。これはstdafx.hのVisual Studioに含まれています。 MFCの下では、主にCStringを使用しますが、これらのものがどこにあるかを知ることは良いことです。

[編集]実行すると、WM_KEYDOWNで再生を開始する必要があります。 PostMessage(WM_KEYDOWN、VK_ESCAPE)は、PostMessage(WM_CHAR、VK_ESCAPE)を直接ダイアログに表示しないことを確認します。そして、m_editBox.PostMessage(WM_KEYDOWN、_T( 'X'))は、エディットボックスに下位のキー 'x'を送ります。しかし、これは別の話題です。

MFCで楽しんでください!

あなたの最後の質問については

確かに、それはあなたがそれをクリックすると、あなたのボタンは、すぐに、フォーカスを獲得すると、少し複雑になります。エディットボックスごとにEN_SETFOCUSのハンドラを作成し、フォーカスを持っている最後のエディットボックスを追跡するためにCWnd *データメンバを追加する必要があります。

あなたのEN_SETFOCUSハンドラは、この

void CdlgDlg::OnEnSetfocusEdit1() 
{ 
    m_pWndLastFocus = &m_edit1; 
} 

ようになるはずです、あなたのコンストラクタでNULLにポインタを設定すると、それはしかしm_pWndLastFocus->PostMessage()を呼び出す前に有効だchjeckすることを忘れないでください。

+0

Windowsヘッダーは、アプリケーションのUNICODE設定に応じて、WM_CHAR、WM_CHARWのいずれかの適切なバージョンを選択することを忘れていました。 –

+0

詳細な返信いただきありがとうございます。あなたの 'PostMessage'アプローチを実装する方法がありますが、必ずしもそれを特定のエディットコントロールに結びつけるわけではありませんか?言い換えれば、Xキーを押したときに、その編集コントロールにフォーカスが当たっているときにのみ、「X」を送りたいと思います。 –

+0

もちろん、ボタンをクリックするとすぐにボタンにフォーカスが得られるので、少し複雑になります。エディットボックスごとにEN_SETFOCUSのハンドラを作成し、フォーカスを持っている最後のエディットボックスを追跡するためにCWnd *データメンバを追加する必要があります。 –

0

MFCで入力を合成する方法は、SendInputメソッドを使用する方法です。

関連する問題