Windows 使用低级 WinAPI 调用在 C++ 中实现表单自动化?还是不知道
Windows Form Automation in C++ using low level WinAPI Calls? Still don't know
Windows Automation via Console Application
这仍然没有回答我的问题。你怎么做呢?因为我从来没有用 C++ 编程过,但我知道 Visual Basic。
请帮忙!
简而言之,您获得了您希望与之交互的 window 的句柄。
FindWindow
很可能是你的朋友。在某些情况下,您可能需要使用 EnumChildWindows
函数。这方面的一个例子是使用 FindWindow
获取 Notepad.exe
实例的主 window 的句柄。获得此句柄后,您可以使用 EnumChildWindows
遍历子列表 windows,其中一个将是您在其中键入文本的控件。
在此之后,您向它发送消息。如果您需要模拟 keystrokes/mouse 事件,您应该使用适当的 window 句柄和函数 SendInput
.
在您希望模拟按钮按下的情况下,您可以使用 SendInput
将鼠标放在按钮上(您需要先获取按钮的 window 句柄,然后再获取它的大小和位置)。您可以使用 Spy++ 或免费的替代方法获取按钮的 ID。 - 另一种选择涉及简单地向按钮的所有者发送 WM_COMMAND 消息,使用与手动单击它时发送的相同参数 - 这种方法可以节省您在定位鼠标和设置之前定位和调整按钮大小的工作左键按下,最后再次设置按钮。
使用第一种方法的程序摘录可能如下所示。请记住,我已经获得了父 window 的句柄并确定了游戏区域的大小和位置。 (代码来自玩XP扫雷游戏的bot)
if (!bombHere)
{
GetClickPos(iFinalX0ffset, iFinalY0ffset, boardPos.left, boardPos.top, &pClick, i, j);
pClick.x = pClick.x * 65536.0f / iScreenW;
pClick.y = pClick.y * 65536.0f / iScreenH;
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, pClick.x, pClick.y, 0, 0);
// since square is both unsolved and safe, left click it once
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
if (moveDelay)
Sleep(moveDelay);
}
Windows Automation via Console Application
这仍然没有回答我的问题。你怎么做呢?因为我从来没有用 C++ 编程过,但我知道 Visual Basic。
请帮忙!
简而言之,您获得了您希望与之交互的 window 的句柄。
FindWindow
很可能是你的朋友。在某些情况下,您可能需要使用 EnumChildWindows
函数。这方面的一个例子是使用 FindWindow
获取 Notepad.exe
实例的主 window 的句柄。获得此句柄后,您可以使用 EnumChildWindows
遍历子列表 windows,其中一个将是您在其中键入文本的控件。
在此之后,您向它发送消息。如果您需要模拟 keystrokes/mouse 事件,您应该使用适当的 window 句柄和函数 SendInput
.
在您希望模拟按钮按下的情况下,您可以使用 SendInput
将鼠标放在按钮上(您需要先获取按钮的 window 句柄,然后再获取它的大小和位置)。您可以使用 Spy++ 或免费的替代方法获取按钮的 ID。 - 另一种选择涉及简单地向按钮的所有者发送 WM_COMMAND 消息,使用与手动单击它时发送的相同参数 - 这种方法可以节省您在定位鼠标和设置之前定位和调整按钮大小的工作左键按下,最后再次设置按钮。
使用第一种方法的程序摘录可能如下所示。请记住,我已经获得了父 window 的句柄并确定了游戏区域的大小和位置。 (代码来自玩XP扫雷游戏的bot)
if (!bombHere)
{
GetClickPos(iFinalX0ffset, iFinalY0ffset, boardPos.left, boardPos.top, &pClick, i, j);
pClick.x = pClick.x * 65536.0f / iScreenW;
pClick.y = pClick.y * 65536.0f / iScreenH;
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, pClick.x, pClick.y, 0, 0);
// since square is both unsolved and safe, left click it once
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
if (moveDelay)
Sleep(moveDelay);
}