AttachThreadInput()函数的原形如下
BOOL AttachThreadInput(
DWORD idAttach, 需要附加的线程ID
DWORD idAttachTo, 附加到的线程ID
BOOL fAttach true 附加 false 取消
);
函数使用的过程大致如下
HWND hWnd;
hWnd = GetForegroundWindow(); 得到当前窗口
if (hWnd == Form1-Handle) return; 排除程序本身的窗口
DWORD FormThreadID = GetCurrentThreadId(); 本程序的线程ID
当前窗口的线程ID
DWORD CWndThreadID = GetWindowThreadProcessId(hWnd, NULL);
附加输入线程
AttachThreadInput(CWndThreadID, FormThreadID, true);
得到当前键盘光标所在的窗口
hWnd = GetFocus();
取消附加的输入线程
AttachThreadInput(CWndThreadID, FormThreadID, false);
hWnd就是当前键盘光标所在的窗口句柄。另外,经过测试发现,在Windows2000系统下发送字符消息(WM_CHAR)时,如果字符是一个汉字,则该字符对应的虚拟键盘码高位不为0,这样得到的字符就不正确。解决办法是做一个与运算 ch & 0xFF就可以了。
下面又到了给出例程的时间了。例程刷刷刷能够在键盘光标所在的文本输入框中自动输入文字(中文、英文、数字),程序使用C++ Builder 5开发。首先运行C++ Builder并新建工程。接着,将窗体Form1的边框样式(BorderStyle)改为对话框(bsDialog),并放置相应控件如图所示,其中SS_Text是一个用于输入文本的TComboBox控件,当然,你可以在设计阶段预先向控件中输入一些常用文本,以便程序运行后可以直接选用; txtTimes和txtDelay为TEdit控件,分别用于控制发送文本的次数和间隔时间;chkAutoWrap和chkAutoNumber