我创建了一个对话框MainDialog.cpp
,其中包含 2个编辑控件,其ID为IDC_EDITCONTROL_A
和IDC_EDITCONTROL_B
,并且变量定义为m_editControlA
和{分别为{1}}。
此外,我有 2个按钮,其ID分别为m_editControlB
和IDC_MFCBUTTON_KEY_X
,变量分别为IDC_MFCBUTTON_KEY_Y
和m_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 events和sendMessage的文档但我无法理解如何实现它,因为我的C ++知识非常基础。另外,在我的previous question之后,我发现Y
会很有用,但我目前的主要问题仍然是发送输入。
任何示例代码或有用的链接对我来说非常有用,可以了解如何在应用程序内模拟键盘输入。
答案 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方法。