-
由于近期电商项目在选品过程中需要复制某平台上的商品ID再粘贴到表格拼接链接后上架的操作甚是繁琐、复杂,便决定自行编写一款软件来代替这烦人的流程。
-
商品ID
选品过程中需要先复制该平台的某个商品ID

鼠标移动到商品ID处会显示”复制“按钮,点击复制。

提示商品ID复制成功后内容将存储在剪贴板里。

然后拼接链接以便用于软件后续的商品上架之用。
至此繁琐的操作问题出现了,如果每天需要选品达上百个,那一直的复制、粘贴、拼接,那岂不是手都要弄废掉?于是便想到了以下方法!
既然点击”复制按钮”商品ID便存储于剪贴板,那我们写个小程序来监制剪贴板不就事半功倍?!
干就完了!先上代码!
窗口注册类
// 注册窗口类。
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.hInstance = hInstance;
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszClassName = "RainbowTools";
return RegisterClassEx(&wcex);
}
创建线程并循环读取windows消息,然后再创建一窗口并隐藏
// 循环读取windows消息 线程模块
static DWORD WINAPI GetMessage(LPVOID pParam)
{
// 注册窗口类
HINSTANCE hInst;
hInst = GetModuleHandle(0);
MyRegisterClass(hInst);
// 创建窗口
HWND hWnd = CreateWindow("RainbowTools", "Clipboard Monitor", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL);
// 隐藏窗口
ShowWindow(hWnd, SW_HIDE);
// 循环接收消息
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
处理主窗口的消息(监控剪贴板内容),判断内容格式并检测是否为纯数字。
// 处理主窗口的消息(监控剪贴板内容)
//
// WM_DRAWCLIPBOARD - 粘贴板内容监控
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hwndNextViewer;
switch (message)
{
case WM_DESTROY:
// 设置Viewer链,移除本Viewer。
ChangeClipboardChain(hWnd, hwndNextViewer);
PostQuitMessage(0);
break;
case WM_CREATE:
// 在窗口创建时,在粘贴板Viewer链中增加一个Viewer
hwndNextViewer = SetClipboardViewer(hWnd);
break;
case WM_CHANGECBCHAIN: // Viewer链中的节点变化时会收到此消息
// 在链中增加本Viewer后,位于链的第一个节点
// 当链中有Viewer移除时,链中的第一个Viewer会收到此消息
// 如果是本Viewer的下一个Viewer移除,那么更新
if ((HWND)wParam == hwndNextViewer)
hwndNextViewer = (HWND)lParam;
// 否则将消息向下一个Viewer传递
else if (hwndNextViewer != NULL)
SendMessage(hwndNextViewer, WM_CHANGECBCHAIN, wParam, lParam);
break;
case WM_DRAWCLIPBOARD: // 剪贴板的内容改变时执行此处代码
// 打开剪贴板
if (OpenClipboard(hWnd))
{
// 判断数据格式
if (IsClipboardFormatAvailable(CF_TEXT))
{
HGLOBAL hClip1 = NULL;
// 读取数据
hClip1 = GetClipboardData(CF_TEXT);
TCHAR *pBuf1 = NULL;
pBuf1 = (TCHAR*)GlobalLock(hClip1);
GlobalUnlock(hClip1);
if (pBuf1 != '\0')
{
CString Targets = NULL;
Targets.Format(TEXT("%s"), pBuf1);
// 判断 Targets 变量是否为数值
if (Targets.SpanIncluding(_T("0123456789")) == Targets)
{
CString Links = NULL;
Links.Format(TEXT("https://mobile.yangkeduo.com/goods.html?goods_id=%s\r\n"), Targets);
CString Files = NULL;
Files.Format(TEXT("%s\\%s-ID.txt"), szSelfPath, Times);
CFile file(Files, CFile::modeWrite | CFile::modeCreate | CFile::modeNoTruncate);
//将文件指针指向末尾
file.SeekToEnd();
//写入文件
file.Write(Links, Links.GetLength());
//关闭文件
file.Close();
}
}
}
}
// 关闭剪贴板
CloseClipboard();
// 将消息发送给Viewer链中的下一个窗口
SendMessage(hwndNextViewer, WM_DRAWCLIPBOARD, wParam, lParam);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
效果演示
完整工具下载
【下载地址1】https://wwrd.lanzoum.com/iqMHR148jsvc
【下载地址2】https://download.youkuaiyun.com/download/qq_39190622/88152958