在C ++ MFC应用程序

时间:2017-06-14 13:37:07

标签: c++ visual-studio-2015 mfc

我创建了一个对话框MainDialog.cpp,其中包含 2个编辑控件,其ID为IDC_EDITCONTROL_AIDC_EDITCONTROL_B,并且变量定义为m_editControlA和{分别为{1}}。

此外,我有 2个按钮,其ID分别为m_editControlBIDC_MFCBUTTON_KEY_X,变量分别为IDC_MFCBUTTON_KEY_Ym_buttonKeyX

以下是源文件中的代码

m_buttonKeyY

我想了解如何将每个按钮发送各自的字符(例如此示例中为#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 } X)添加到所选的编辑控件如果选择了一个。基本上,我想模拟键盘输入

我已经阅读了有关how to simulate keyboard eventssendMessage的文档但我无法理解如何实现它,因为我的C ++知识非常基础。另外,在我的previous question之后,我发现Y会很有用,但我目前的主要问题仍然是发送输入。

任何示例代码或有用的链接对我来说非常有用,可以了解如何在应用程序内模拟键盘输入。

2 个答案:

答案 0 :(得分:2)

使用WM_CHAR消息将字符从OS发送到编辑控件。

实际上它比这复杂一点,但你不需要模拟整个WM_KEYUP WM_KEYDOWN消息序列,因为它的最终结果是生成WM_CHAR消息。

您可以使用CWnd :: PostMessage将字符直接发送到您的编辑控件,即使它们没有焦点。

您可能已在此处找到WM_CHAR的文档:https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms646276(v=vs.85).aspx

哎呀..请原谅我的法语,英语医生就在这里 https://msdn.microsoft.com/en-us/library/windows/desktop/ms646276(v=vs.85).aspx

(只是将fr-fr改为en-us就可以了,它可能适用于所有其他语言,整洁!

  • wParam 包含您要发送的字符。可以是纯ASCII字符,也可以是VK_常量之一......我建议你使用unicode版本WM_CHARW,因为现在大多数windows软件都使用unicode。宽字符的符号是L' X'或者_T(' X'),unicode(UTF-16)字符类型是wchar_t。

  • lParam 包含其他按键细节,0对于您想要做的事情应该没问题。

发送X,只需致电

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

当使用_T()表示法时,括号之间的字符(或字符串)字面值将自动转换为应用程序的unicode设置的正确字符宽度(您应该将其设置为UNICODE,因为&#例如,操作系统正在使用的是Windows CE的唯一有效编码,您应该习惯于操作此类型。

几乎所有在字符串上运行的C库函数的_T()宏和_t *覆盖都在tchar.h中定义,tchar.h由Visual Studio在stdafx.h中包含。在MFC下,你主要使用CString,但知道这些东西的位置很好。

[编辑]当你开始运行时,你应该开始玩WM_KEYDOWN。您将发现直接到您的对话框的PostMessage(WM_CHAR,VK_ESCAPE)不会关闭它,而PostMessage(WM_KEYDOWN,VK_ESCAPE)则会关闭它。并且m_editBox.PostMessage(WM_KEYDOWN,_T(' X'))将发送一个较低的键' x'到你的编辑框。但这是另一个需要调查的话题。

与MFC玩得开心!

关于你的上一个问题:

当然,但是它会变得有点复杂,因为只要你点击它,你的按钮就会获得焦点。您必须为编辑框的eeach创建EN_SETFOCUS处理程序,并添加CWnd *数据成员以跟踪最后一个具有焦点的编辑框。

您的EN_SETFOCUS处理程序应该看起来像这样

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

不要忘记在构造函数中将指针设置为NULL,并在调用m_pWndLastFocus->PostMessage()之前使其有效。

答案 1 :(得分:0)

在MFC中合成输入的方法是使用SendInput方法。