关于bcb自制软键盘的问题。求指导。

点点朋 2013-05-14 10:30:35
我想用软键盘模拟按键操作。我打算软键盘用form做,类似这样

我希望按下a按钮,而输入焦点在后面那个form的文本编辑框,在此键入a

网上说有个解决方案可以用:
1)Form1始终让edit控件具有输入焦点;
2)Form2由另一个线程来创建;
3)使用WIN32 API的AttachThreadInput(Thread1ID, Thread2ID, TRUE)将Form1和Form2两个窗口的线程本地状态关联起来;

说得通俗点,Form1和Form2共享一个输入焦点,且两个窗口共享所有的鼠标,键盘操作。


但是不知道具体怎么做。希望友人指导一下。
...全文
191 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
eaglewing1021 2014-05-07
  • 打赏
  • 举报
回复
??功能实现了吗?我也想实现这个功能
xjq2003 2013-05-15
  • 打赏
  • 举报
回复


首先运行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); 

} 

//--------------------------------------------- 


Richardw 2013-05-15
  • 打赏
  • 举报
回复
如果你这个软键盘只是你这一个程序内部使用的话,直接包含,直接调用就好了,不用考虑这么复杂
路过路人乙 2013-05-14
  • 打赏
  • 举报
回复
Iocomp控件有个虚拟键盘的控件...
缘中人 2013-05-14
  • 打赏
  • 举报
回复
我不懂电脑 2013-05-14
  • 打赏
  • 举报
回复
好像 bcb2010带了软键盘组件

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧