首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

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

2013-06-26 
关于bcb自制软键盘的问题。求指导。我想用软键盘模拟按键操作。我打算软键盘用form做,类似这样我希望按下a按

关于bcb自制软键盘的问题。求指导。
我想用软键盘模拟按键操作。我打算软键盘用form做,类似这样关于bcb自制软键盘的有关问题。求指导

我希望按下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); 



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


热点排行