Skip to content

Commit bf4fcd3

Browse files
committed
feat(cmds): 添加toast命令
1 parent a1bf994 commit bf4fcd3

18 files changed

Lines changed: 532 additions & 3 deletions

Cargo.lock

Lines changed: 10 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

100644100755
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,7 @@ path = "./cmds/limit"
2323

2424
[dependencies.core]
2525
path = "./cmds/remote-bind/core"
26+
27+
[build-dependencies]
28+
cc = "1.2.50"
29+
macro-log = "0.3.0"

build.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
use macro_log::read_dir;
2+
3+
fn debug(obj: &impl std::fmt::Debug, tag: &str) {
4+
println!("cargo:warning=[Debug] {}: {tag} -> {obj:?}", file!());
5+
}
6+
7+
fn main() {
8+
let mut cc = cc::Build::new();
9+
read_dir!("src/ffi").iter().for_each(|(file_name, _)| {
10+
if file_name.ends_with(".c") || file_name.ends_with(".cpp") {
11+
cc.file(format!("src/ffi/{file_name}"));
12+
debug(file_name, "compile file");
13+
}
14+
});
15+
cc.compile("ffi");
16+
}

src/args.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@ pub enum Commands {
1515
RBS(crate::mods::rbs::Param),
1616
RBC(crate::mods::rbc::Param),
1717
Oneport(crate::mods::oneport::Param),
18+
Toast(crate::mods::toast::Param),
1819
Install(crate::mods::install::Param),
1920
}

src/ffi/Win32Helper/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
file(GLOB_RECURSE files RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" *.c)
2+
message(STATUS "构建Win32Helper: ${files}")
3+
add_library(Win32Helper STATIC ${files})
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#include "include.h"
2+
#include <stdio.h>
3+
4+
void alloc_console() {
5+
// 分配控制台,并使用特殊文件名"CONOUT$"重新打开输入流stdout: FILE *
6+
AllocConsole();
7+
FILE* file = NULL;
8+
freopen_s(&file, "CONOUT$", "w+", stdout);
9+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include "include.h"
2+
3+
void balloon_notification(HWND hwnd, UINT id, const wchar_t *message) {
4+
NOTIFYICONDATAW nid = {0};
5+
nid.uID = id;
6+
nid.cbSize = sizeof nid;
7+
nid.hWnd = hwnd; // 必须要设置hWnd
8+
9+
nid.uFlags |= NIF_ICON;
10+
nid.hIcon = LoadIconA(NULL, IDI_SHIELD);
11+
12+
// nid.uFlags |= NIF_MESSAGE;
13+
// nid.uCallbackMessage = WM_USER + 2;
14+
15+
nid.uFlags |= NIF_INFO;
16+
nid.dwInfoFlags = NIIF_ICON_MASK; // 必须要设置hIcon
17+
lstrcpyW(nid.szInfoTitle, L"通知");
18+
lstrcpyW(nid.szInfo, message);
19+
SYSCALL(Shell_NotifyIconW(NIM_ADD, &nid));
20+
21+
Sleep(80); // 延迟隐藏以显示进程名,似乎会导致无法接收消息
22+
// 隐藏图标
23+
nid.uFlags |= NIF_STATE;
24+
nid.dwState = NIS_HIDDEN;
25+
nid.dwStateMask = NIS_HIDDEN;
26+
SYSCALL(Shell_NotifyIconW(NIM_MODIFY, &nid));
27+
}

src/ffi/Win32Helper/include.h

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#ifndef __WIN32_HELPER__
2+
#define __WIN32_HELPER__
3+
#ifdef __cplusplus
4+
extern "C" {
5+
#endif
6+
7+
#include <Windows.h>
8+
9+
// 检查表达式是否为真
10+
#define CHECK(call) ;\
11+
if (!(call)) {\
12+
SetLastError(-1);\
13+
Perror(#call);\
14+
}\
15+
;
16+
// 检查Win32系统调用
17+
#define SYSCALL(call) ;\
18+
SetLastError(0);\
19+
call;\
20+
Perror(#call);\
21+
;
22+
// 检查Win32系统调用,同时将返回值赋值给某变量
23+
#define SYSCALL2(call, recv) ;\
24+
SetLastError(0);\
25+
recv = call;\
26+
Perror(#call);\
27+
;
28+
#define Perror(x) _Perror(x, __FILE__, __LINE__)
29+
30+
void win32_init();
31+
void init_locale(const char *locale);
32+
long _Perror(char *op, const char *file, int line);
33+
34+
// ANSI转义序列
35+
#define GREEN "\x1B[32m"
36+
#define RED "\x1B[91m"
37+
#define RESET "\x1B[0m"
38+
void enable_virtual_terminal_processing();
39+
40+
void alloc_console();
41+
42+
void balloon_notification(HWND hwnd, UINT id, const wchar_t *message);
43+
44+
wchar_t *utf8to16(const char *str);
45+
46+
char *utf16to8(const wchar_t *str);
47+
48+
#ifdef __cplusplus
49+
}
50+
#endif
51+
#endif // __WIN32_HELPER__

src/ffi/Win32Helper/init.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#include "include.h"
2+
3+
void win32_init() {
4+
#ifndef NDEBUG
5+
// 执行字符集是UTF-8
6+
init_locale("zh_CN.UTF-8");
7+
alloc_console();
8+
#else
9+
// 执行字符集是GBK
10+
init_locale("zh_CN.BGK");
11+
// alloc_console();
12+
#endif
13+
enable_virtual_terminal_processing();
14+
}

src/ffi/Win32Helper/init_locale.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#include <locale.h>
2+
3+
void init_locale(const char *locale) {
4+
setlocale(LC_ALL, locale);
5+
}

0 commit comments

Comments
 (0)