读书人

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

发布时间: 2013-06-26 14:29:32 作者: rapoo

关于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);

}

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


读书人网 >C++ Builder

热点推荐