关于bcb自制软键盘的问题。求指导。
我想用软键盘模拟按键操作。我打算软键盘用form做,类似这样
我希望按下a按钮,而输入焦点在后面那个form的文本编辑框,在此键入a
网上说有个解决方案可以用:
1)Form1始终让edit控件具有输入焦点;
2)Form2由另一个线程来创建;
3)使用WIN32 API的AttachThreadInput(Thread1ID, Thread2ID, TRUE)将Form1和Form2两个窗口的线程本地状态关联起来;
说得通俗点,Form1和Form2共享一个输入焦点,且两个窗口共享所有的鼠标,键盘操作。
但是不知道具体怎么做。希望友人指导一下。 线程 软键盘 输入焦点
[解决办法]
这里有个源码啊http://www.pconline.com.cn/pcedu/empolder/gj/cb/0206/65594_2.html
[解决办法]
如果你这个软键盘只是你这一个程序内部使用的话,直接包含,直接调用就好了,不用考虑这么复杂
[解决办法]
首先运行C++ Builder并新建工程。接着,将窗体Form1的边框样式(BorderStyle)改为对话框(bsDialog),并放置相应控件如图所示,其中SS_Text是一个用于输入文本的TComboBox控件,当然,你可以在设计阶段预先向控件中输入一些常用文本,以便程序运行后可以直接选用; txtTimes和txtDelay为TEdit控件,分别用于控制发送文本的次数和间隔时间;chkAutoWrap和chkAutoNumber为TCheckBox控件,决定是否在每一行发送文本后面自动回车或自动加记数编号; 以上控件包含在Panel1(TPanel控件)中; Timer1用于控制循环发送和时间间隔。
下面是程序清单:
//--------------------------------------------
#include
#pragma hdrstop
#include "Unit1.h"
//--------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
int nTotalTimes, // 发送本文的总次数
nTimes; // 已经发送的次数
TForm1 *Form1;
//--------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------
void __fastcall TForm1::btnStartClick(TObject *Sender) // 开始刷屏
{ if (SS_Text->Text.IsEmpty())
{
// 文本不能为空
ShowMessage("请输入刷刷文本!");
SS_Text->SetFocus();
return;
}
__try
{
// Timer1->Interval取值为n秒(最小为50毫秒)
int Interval = StrToInt(txtDelay->Text);
Timer1->Interval = (Interval > 0) ? Interval * 1000 : 50;
// nTotalTimes取值为n次(最小为0次)
nTotalTimes = StrToInt(txtTimes->Text);
if (nTotalTimes < 0)
nTotalTimes = 0;
nTimes = 0;
Timer1->Enabled = true;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
ShowMessage("请输入数值类型数据!");
return;
}
btnStart->Enabled = false;
btnStop->Enabled = true;
Panel1->Enabled = false;
Application->Minimize(); // 最小化刷刷窗口
}
//--------------------------------------------
void __fastcall TForm1::btnStopClick(TObject *Sender)// 停止刷屏
{
Timer1->Enabled = false;
btnStart->Enabled = true;
btnStop->Enabled = false;
Panel1->Enabled = true;
}
//--------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
// 现刷屏nTimes次,到nTotalTimes次后完成。
if (nTimes == nTotalTimes)
{
btnStopClick(Sender);
return;
}
HWND hWnd;
hWnd = GetForegroundWindow(); // 得到当前窗口
if (hWnd == Form1->Handle) return; // 不需要程序本身的窗口
DWORD FormThreadID = GetCurrentThreadId();
DWORD CWndThreadID = GetWindowThreadProcessId(hWnd, NULL);
// 附加输入线程
AttachThreadInput(CWndThreadID, FormThreadID, true);
hWnd = GetFocus(); // 得到当前键盘光标所在的窗口
AttachThreadInput(CWndThreadID, FormThreadID, false); // 取消
if (hWnd == NULL) return;
nTimes++;
for (int i = 1; i <= SS_Text->Text.Length(); i++)
{ // 模拟键盘按键输入文本
PostMessage(hWnd, WM_CHAR, (WPARAM)(SS_Text->Text[i] & 0xFF), 0);
}
if (chkAutoNumber->Checked)
{ // 自动编号
AnsiString Lines = IntToStr(nTimes);
for (int j = 1; j <= Lines.Length(); j++)
PostMessage(hWnd, WM_CHAR, (WPARAM)(Lines[j]), 0);
}
if (chkAutoWrap->Checked) // 自动回车
PostMessage(hWnd, WM_KEYDOWN, VK_RETURN, 0);
}
//---------------------------------------------