65.9K
CodeProject 正在变化。 阅读更多。
Home

CKeystrokeEngine

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.98/5 (28投票s)

2002年2月19日

CPOL

4分钟阅读

viewsIcon

317963

downloadIcon

7678

一组用于向选定窗口发送击键的类。

引言

CKeystrokeEngine 最初是为了让我的产品 Macro Angel 的用户能够向活动窗口或选定窗口发送按键。它的功能类似于 VB 的 SendKeys,但它允许更复杂的操作。除了向活动窗口发送按键外,在 CWindowEngine(它也是为 Macro Angel 编写的)的帮助下,它可以只向指定窗口发送按键。

一个简单的 CKeystrokeEngine 表达式看起来像这样

Hello CPians<ENTER><REPEAT 10>I love CP <END_REPEAT><ENTER>http://www.macroangel.com

所有特殊按键都放在 '<' 和 '>' 字符之间。例如,要模拟 Enter 键,您应该使用 <ENTER>。或者要按下 Shift 键,请使用 <SHIFT>。这里还有一些例子

  • 发送 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 秒。
  • 要重复一个按键序列 100 次,请使用 <REPEAT 100>您的按键<END_REPEAT>。请注意,不支持嵌套重复

所有其他按键都在示例应用程序中列出。以下是 CKeystrokeEngine 的公共函数

CKeystrokeEngine (const CString &sKeys);

void SetPause (bool bPause, int nPause);
void SetSendToWnd (bool bSendToWnd);
// if lpszTitle == NULL, then the feature is disabled
void SetWndTitle (LPCSTR lpszTitle);
// if lpszClass == NULL, then the feature is disabled
void SetWndClass (LPCSTR lpszClass);
void SetExactMatch (bool bExact);
void SetCaseSensitive (bool bCaseSensitive);
void SetReActivate (bool bReactivate, int nMiliseconds);

// Tadaaa. Here is the best function...
bool SendKeys ();

SetPause (bool bPause, int nPause)
调整 CKeystrokeEngine 在发送按键时每个按键之间应该等待的时间。在一些更快的机器上,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)
指定输入的窗口标题是部分匹配还是必须完全匹配。当设置为 false 时,CKeystrokeEngine 将搜索包含该文本的窗口标题。请注意,仅当使用 SetSendToWnd (true) 时才有效。

SetCaseSensitive (bool bCaseSensitive)
如果启用,窗口标题/窗口类和文本搜索将区分大小写。请注意,仅当使用 SetSendToWnd (true) 时才有效。

SetReActivate (bool bReActivate, int nMiliseconds)
如果 bReActivate 设置为 true,则 CKeystrokeEngine 在窗口失去焦点时会自动重新激活它。如果输入 0 秒,则窗口在失去焦点时立即激活。否则,CKeystrokeEngine 将等待指定的时间然后重新激活窗口。

在重新激活窗口之前添加延迟可以防止同时尝试发送按键的应用程序之间的冲突。

请注意,仅当使用 SetSendToWnd (true) 时才有效。此外,如果 bReActivate 设置为 false,并且指定的窗口失去焦点,则 SendKeys () 函数将返回 false。

bool SendKeys ()
最后,此函数根据指定选项发送按键。使用此函数设置 CSendKeystrokes 的所有属性。

要获取有关支持的关键字的更多信息,请使用示例应用程序...

您应该记住的一些要点

  • 要在您的应用程序中使用 CKeystrokeEngine,请将 KeystrokeEngine.cppKeystrokeEngine.hWindowEngine.cppWindowEngine.h 复制到您的项目中,并在您的 cpp 文件中包含 KeystrokeEngine.h
  • 此类使用自己的语法,而不是 VB 的 SendKeys () 语法。请不要让我更改语法。我的客户对这种语法非常满意 :)
  • 此类在 Macro Angel 的当前版本中未使用。它将在下一个版本中使用。当前版本使用相同的语法,但实现不如这个好。但是这个类还没有经过测试,可能包含一些错误。请将错误发送给我,以便我修复它们。如果您发现错误,请将导致其无法正常工作的字符串发送给我。另外,请发送实际输出和预期输出。
  • 如果您有任何建议,请告诉我。
© . All rights reserved.