forked from Zhu-Xinrong/single
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathauto_clicker.cpp
More file actions
157 lines (157 loc) · 5.29 KB
/
auto_clicker.cpp
File metadata and controls
157 lines (157 loc) · 5.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include <flat_map>
#include <iostream>
#include "cpp_utils/windows_app_tools.hpp"
#include "cpp_utils/windows_console_ui.hpp"
constexpr auto func_back{ cpp_utils::console_ui::func_back };
constexpr auto func_exit{ cpp_utils::console_ui::func_exit };
enum class mouse_button
{
left,
mid,
right
};
const auto unsynced_mem_pool{ [] static noexcept
{
static std::pmr::unsynchronized_pool_resource pool{
std::pmr::pool_options{ .max_blocks_per_chunk{ 1024 }, .largest_required_pool_block{ 4096 } },
std::pmr::new_delete_resource()
};
std::pmr::set_default_resource( &pool );
return static_cast< std::pmr::memory_resource* >( &pool );
}() };
const cpp_utils::console con;
auto click( const mouse_button button )
{
DWORD flag;
switch ( button ) {
case mouse_button::left : flag = MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP; break;
case mouse_button::mid : flag = MOUSEEVENTF_MIDDLEDOWN | MOUSEEVENTF_MIDDLEUP; break;
case mouse_button::right : flag = MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP; break;
default : std::unreachable();
}
mouse_event( flag, 0, 0, 0, 0 );
}
auto clear_istream_buffer( std::istream& stream ) noexcept
{
stream.clear();
stream.ignore();
}
std::chrono::milliseconds sleep_time{};
mouse_button current_mouse_button;
int click_times{};
auto execute( cpp_utils::console_ui::func_args args ) noexcept
{
args.parent_ui.set_constraints( true, true );
using namespace std::chrono_literals;
for ( auto i{ 5 }; i > 0; --i ) {
std::print( " (i) 请在 {} 秒内将鼠标移动到指定位置.\r", i );
std::this_thread::sleep_for( 1s );
}
con.clear();
std::print( " -> 开始执行." );
for ( auto _{ 0 }; _ < click_times; ++_ ) {
click( current_mouse_button );
}
return func_back;
}
auto init_if_ok( const cpp_utils::console_ui::func_args& args, const std::size_t idx ) noexcept
{
using namespace std::string_view_literals;
static bool is_ok[ 3 ]{};
is_ok[ idx ] = true;
if ( is_ok[ 0 ] && is_ok[ 1 ] && is_ok[ 2 ] ) {
args.parent_ui.set_text( 0, " Auto Clicker\n\n"sv ).add_back( " > 执行 "sv, execute );
}
}
auto set_click_times( cpp_utils::console_ui::func_args args ) noexcept
{
args.parent_ui.set_constraints( false, true );
std::print( "请输入点击次数: " );
while ( true ) {
std::cin >> click_times;
clear_istream_buffer( std::cin );
if ( click_times > 0 ) [[likely]] {
break;
}
std::print( "数据错误, 请重新输入: " );
}
init_if_ok( args, 0 );
return func_back;
}
auto set_sleep_time( cpp_utils::console_ui::func_args args ) noexcept
{
args.parent_ui.set_constraints( false, true );
std::print( "请输入间隔时间 (单位: 毫秒): " );
int64_t input;
while ( true ) {
std::cin >> input;
clear_istream_buffer( std::cin );
if ( input > 0 ) [[likely]] {
sleep_time = std::chrono::milliseconds{ input };
break;
}
std::print( "数据错误, 请重新输入: " );
}
init_if_ok( args, 1 );
return func_back;
}
auto set_button( cpp_utils::console_ui::func_args args ) noexcept
{
const std::flat_map< char, mouse_button, std::less< char >, std::pmr::vector< char >, std::pmr::vector< mouse_button > > mouse_key_map{
{'l', mouse_button::left },
{'m', mouse_button::mid },
{'r', mouse_button::right}
};
args.parent_ui.set_constraints( false, true );
std::print( "按下左键 (L), 中键 (M), 还是右键 (R)?\n请输入 (不区分大小写): " );
std::string tmp;
while ( true ) {
std::cin >> tmp;
clear_istream_buffer( std::cin );
if ( tmp.size() == 1 && mouse_key_map.contains( tmp.front() | 32 ) ) {
current_mouse_button = mouse_key_map.at( tmp.front() | 32 );
break;
}
std::print( "请输入错误, 请重新输入: " );
}
init_if_ok( args, 2 );
return func_back;
}
auto quit() noexcept
{
return func_exit;
}
auto relaunch_as_admin() noexcept
{
cpp_utils::clone_self();
return func_exit;
}
auto main() -> int
{
using namespace std::string_view_literals;
con.ignore_exit_signal( true )
.enable_window_minimize_ctrl( false )
.enable_window_maximize_ctrl( false )
.enable_window_close_ctrl( false )
.enable_context_menu( false )
.set_charset( 936 )
.set_title( L"Auto Clicker" )
.set_size( 50, 25, unsynced_mem_pool )
.fix_size( true );
cpp_utils::console_ui ui{ con, unsynced_mem_pool };
ui.add_back(
" Auto Clicker\n\n\n"
" (i) 全部设置后即可执行.\n"sv )
.add_back( " < 退出 "sv, quit, cpp_utils::console_text::foreground_red | cpp_utils::console_text::foreground_intensity );
if ( !cpp_utils::is_run_as_admin() ) {
ui.add_back(
" < 以管理员权限重启 "sv, relaunch_as_admin,
cpp_utils::console_text::foreground_green | cpp_utils::console_text::foreground_intensity );
}
ui.add_back( ""sv )
.add_back( " > 设置 点击次数"sv, set_click_times )
.add_back( " > 设置 点击间隔时间 "sv, set_sleep_time )
.add_back( " > 设置 点击键 "sv, set_button )
.show();
return EXIT_SUCCESS;
}