C++ 用钩子截取和修改串口信息的demo
时间: 2024-03-13 07:47:39 浏览: 18
以下是一个使用钩子截取和修改串口信息的 C++ DEMO:
```c++
#include <iostream>
#include <string>
#include <vector>
#include <windows.h>
// 打开串口
HANDLE open_serial_port(const std::string& port_name) {
HANDLE hSerial = CreateFileA(port_name.c_str(), GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
if (hSerial == INVALID_HANDLE_VALUE) {
std::cerr << "Failed to open serial port " << port_name << std::endl;
return nullptr;
}
DCB dcbSerialParams;
GetCommState(hSerial, &dcbSerialParams);
dcbSerialParams.BaudRate = CBR_115200;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
SetCommState(hSerial, &dcbSerialParams);
return hSerial;
}
// 钩子回调函数
LRESULT CALLBACK hook_callback(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode < 0) {
return CallNextHookEx(nullptr, nCode, wParam, lParam);
}
KBDLLHOOKSTRUCT* pKeyStruct = (KBDLLHOOKSTRUCT*)lParam;
if (pKeyStruct->vkCode == VK_RETURN) {
// 截取并修改串口信息
HWND hWnd = GetForegroundWindow();
char buf[1024];
GetWindowTextA(hWnd, buf, sizeof(buf));
std::string data(buf);
std::cout << "Received data [" << data << "]" << std::endl;
data = "MODIFIED: " + data;
SetWindowTextA(hWnd, data.c_str());
}
return CallNextHookEx(nullptr, nCode, wParam, lParam);
}
int main() {
// 打开串口
HANDLE hSerial = open_serial_port("COM1");
// 设置钩子
HHOOK hHook = SetWindowsHookEx(WH_KEYBOARD_LL, hook_callback, GetModuleHandle(nullptr), 0);
// 监控串口
if (hSerial != nullptr) {
char buf[1024];
while (true) {
DWORD dwBytesRead;
if (ReadFile(hSerial, buf, sizeof(buf), &dwBytesRead, nullptr)) {
if (dwBytesRead > 0) {
std::string data(buf, buf + dwBytesRead);
std::cout << "Received data [" << data << "]" << std::endl;
}
}
}
}
// 卸载钩子
UnhookWindowsHookEx(hHook);
// 关闭串口
CloseHandle(hSerial);
return 0;
}
```
在这个 DEMO 中,我们打开了串口 `COM1`,并使用钩子监控键盘输入事件。当用户按下回车键时,我们截取并修改当前窗口的标题,并将其发送到串口上。同时,我们也可以从串口上接收数据,并将其打印出来。注意,在使用钩子时,我们需要在程序退出前卸载钩子,否则可能会导致系统稳定性问题。