资深光能
#include <windows.h>
#define ALT_1 0x1101
#define ID_1 0x1102
/*
我没写中文注释的地方可以暂时忽略
如果看不懂的话可以先看 WinMain 函数(主函数)
然后看 CALLBACK(回调函数)里面的 WM_CREATE
然后是 WM_PAINT
然后是 WM_HOTKEY
然后是 WM_TIMER
看不懂没关系的,抄多了就看得懂了
如果我哪儿写错了记得和我说一声
*/
int alt1=0; //用于存储是否设置了计时器
/* This is where all the input to the window goes to */
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
//管他的,抄就完事了,看不懂就抄,抄多了就看得懂了
HDC hdc;//设备上下文句柄(好像是 Handle of Device Contexts 的缩写)
PAINTSTRUCT pa;//该结构体包含了应用程序用来绘制它所拥有的窗口客户区所需要的信息
switch(Message) {
case WM_TIMER: {//计时器消息
switch(wParam)
{
case ID_1: {//如果是我们的计时器的名称
//核心代码
mouse_event(MOUSEEVENTF_LEFTDOWN|MOUSEEVENTF_LEFTUP,0,0,0,0);//按下并抬起鼠标
break;
}
}
break;
}
case WM_HOTKEY: {//热键消息
switch(wParam) //这个参数用于判断按下了哪个热键(即快捷键)
{
case ALT_1: {//如果是我们设置的这个快捷键的标识符
if(alt1==1) //如果设置过了计时器,那么结束计时器
{
KillTimer(hwnd,ID_1);//销毁计时器
alt1=0;//修改标记
SetWindowText(hwnd,"连点器 - 未开始点击");//修改窗口标题
}
else //如果没有设置过计时器,那么设置计时器
{
SetTimer(hwnd,ID_1,100,NULL);//每 100 ms 触发一次计时器
alt1=1;//修改标记
SetWindowText(hwnd,"连点器 - 已开始点击");//修改窗口标题
}
break;
}
}
break;
}
case WM_PAINT: {//绘制窗口
hdc=BeginPaint(hwnd,&pa);//开始绘制,返回值是指定窗口的 显示设备描述表 句柄。
SetBkMode(hdc,TRANSPARENT);//设置背景混合模式为透明,也就是文字没有底色
SetTextColor(hdc,RGB(0,0,0));//设置文字 RGB 颜色值为黑色
TextOut(hdc,//设备上下文句柄(不用纠结这是什么东西)
0,0,//开始绘制的坐标值,以这个窗口的左上角为坐标原点
" 按 Alt + 1 开始/结束点击,10次/秒",//要输出的文字
strlen(" 按 Alt + 1 开始/结束点击,10次/秒")/*字符串的长度*/);
EndPaint(hwnd,&pa);//结束绘制
break;
}
case WM_CREATE: {//窗口创建消息
SetWindowPos(hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);//设置本程序窗口置顶
RegisterHotKey(hwnd,ALT_1,MOD_ALT,'1'); //注册 Alt+1 的热键,注意,不要冲突了
//第二个参数 ALT_1 用于定义热键的标识符
break;
}
/* Upon destruction, tell the main thread to stop */
case WM_DESTROY: {
PostQuitMessage(0);
break;
}
/* All other messages (a lot of them) are processed using default procedures */
default:
return DefWindowProc(hwnd, Message, wParam, lParam);
}
return 0;
}
/* The 'main' function of Win32 GUI programs: this is where execution starts */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
WNDCLASSEX wc; /* A properties struct of our window */
HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */
MSG msg; /* A temporary location for all messages */
/* zero out the struct and set the stuff we want to modify */
memset(&wc,0,sizeof(wc));
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = WndProc; /* This is where we will send messages to */
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
/* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszClassName = "WindowClass";
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */
if(!RegisterClassEx(&wc)) {
MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,
"WindowClass",//窗口类,直接默认就好了,如果改了的话记得往上数 10 行的那个"WindowClass"也要改
"连点器 - 未开始点击",//窗口标题
WS_VISIBLE|WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, /* x */ //窗口左上角x坐标,不用管它,这个是默认的
CW_USEDEFAULT, /* y */ //窗口左上角y坐标,不用管它,这个是默认的
320, /* width */ //窗口宽度
240, /* height */ //窗口高度
NULL,NULL,hInstance,NULL);
if(hwnd == NULL) {
MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}
/*
This is the heart of our program where all input is processed and
sent to WndProc. Note that GetMessage blocks code flow until it receives something, so
this loop will not produce unreasonably high CPU usage
*/
while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */
TranslateMessage(&msg); /* Translate key codes to chars if present */
DispatchMessage(&msg); /* Send it to WndProc */
}
return msg.wParam;
}
孙楷航在2021-03-28 20:57:05追加了内容
看下面
资深光能