CKeystrokeEngine最初是为了我的作品Macro Angel(http://www.macroangel.com/)的用户能够发送击键消息到活动或选定的窗口而写。它的功能类似于VB中的SendKey,但它能够进行更复杂的操作。在CWindowEngine的帮助下,除了能够发送击键消息到活动窗口,它还能发送击键消息到指定的窗口。
snoopy每日一译-向窗口发送击键消息的类CKeystrokeEngine
by:Mustafa Demirhan 2003.7.3
from:codeGuru
翻译:snoopy
简介:
CKeystrokeEngine最初是为了我的作品Macro Angel(http://www.macroangel.com/)的用户能够发送击键消息到活动或选定的窗口而写。它的功能类似于VB中的SendKey,但它能够进行更复杂的操作。在CWindowEngine的帮助下,除了能够发送击键消息到活动窗口,它还能发送击键消息到指定的窗口。
一个简单的CKeystrokeEngine语句如:
Hello World!<ENTER><REPEAT 10>I love open source<ENTER><END_REPEAT>
Mustafa Demirhan
所有的特殊键都使用'<'和'>'包括。例如,仿真一个回车键,使用<ENTER>。下面是一些例子:
Ctrl+A:使用<CTRL>A.
Alt+F4:使用<ALT><F4>.
Ctrl+Alt+Shift+A:<CTRL+ALT+SHIFT>A.
你也可以使用:<CTRL+ALT>, <CTRL+SHIFT>, 和 <ALT+SHIFT>.
为了保持Shift键或其它键,你可以使用:<SHIFT_LOCK>在这写入你的另外一些键<SHIFT_UNLOCK>.
你还可以使用:<ALT_LOCK>, <ALT_UNLOCK>, <CTRL_LOCK>, 和 <CTRL_UNLOCK>.
你可以使用<DELAY xxx> 来延迟,xxx 的单位是毫秒。例如,<DELAY 1500> 表示延迟1.5秒.
你还可以使用<REPEAT 100>you keys here<END_REPEAT>重复100次,注意嵌套的重复是不支持的。
以下是CKeystrokeEngine的公共函数:
CKeystrokeEngine (const CString &sKeys);
void SetPause (bool bPause, int nPause);
void SetSendToWnd (bool bSendToWnd);
// 如果lpszTitle == NULL, 这个特性不能使用
void SetWndTitle (LPCSTR lpszTitle);
// 如果lpszClass == NULL, 这个特性不能使用
void SetWndClass (LPCSTR lpszClass);
void SetExactMatch (bool bExact);
void SetCaseSensitive (bool bCaseSensitive);
void SetReActivate (bool bReactivate, int nMiliseconds);
bool SendKeys ();
SetPause (bool bPause, int nPause)
设定发送击键消息时,两次击键之间的间隔时间。在一些机器中,CKeystrokeEngine可能会击键太快,令键盘缓冲溢出,导致不可预测的结果。设定时间间隔可以防止这中错误。
SetSendToWnd (bool bSendToWnd)
如果bSendToWnd是true,CKeystrokeEngine发送所有击键到一个指定的窗口。这样做,可以防止发送消息到错误的窗口。如果bSendToWnd 设为false,所有击键消息发送到活动窗口。
SetWndTitle (LPCSTR lpszTitle)
设定窗口标题,有此标题的窗口接受击键消息。如果lpszTitle设定为NULL,CKeystrokeEngine不会搜索窗口标题。注意只有SetSendToWnd (true)使用后,才有效。
SetWndClass (LPCSTR lpszClass)
设定窗口类,该类窗口可以接受击键消息。如果lpszClass设为NULL,CKeystrokeEngine不会搜索窗口类。注意只有SetSendToWnd (true)使用后,才有效。
SetExactMatch (bool bExact)
指明窗口标题是部分匹配还是精确匹配。注意只有SetSendToWnd (true)使用后,才有效。
SetCaseSensitive (bool bCaseSensitive)
指明窗口标题或窗口类搜索是否大小写敏感。注意只有SetSendToWnd (true)使用后,才有效。
SetReActivate (bool bReActivate, int nMiliseconds)
如果bReActivate为真,CKeystrokeEngine自动自动激活窗口。当nMiliseconds为0秒,窗口立即被激活,否则CKeystrokeEngine将等待指定时间再激活窗口。在激活窗口前加入一个延迟可以防止应用程序之间同时发送击键消息的冲突。
当bReActivate设为false,SendKeys ()将返回false。
注意只有SetSendToWnd (true)使用后,才有效。
bool SendKeys ()
最后,这个函数发送击键消息。
想得到更多的信息,请使用例子程序...
还有几点你必须牢记在心:
拷贝KeystrokeEngine.cpp, KeystrokeEngine.h, WindowEngine.cpp, 和 WindowEngine.h 到你的工程中,include KeystrokeEngine.h 。
使用CKeystrokeEngine时,使用它自己的语法,而不要使用VB的SendKeys()语法。
如果你有什么建议,让我知道。我的E-MAIL是emindemirhan@yahoo.com。