xtn-tools-pro 1.0.1.3.2__tar.gz → 1.0.1.3.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. {xtn-tools-pro-1.0.1.3.2/xtn_tools_pro.egg-info → xtn-tools-pro-1.0.1.3.4}/PKG-INFO +1 -1
  2. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/setup.py +3 -2
  3. xtn-tools-pro-1.0.1.3.4/xtn_tools_pro/utils/win.py +99 -0
  4. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4/xtn_tools_pro.egg-info}/PKG-INFO +1 -1
  5. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro.egg-info/SOURCES.txt +2 -1
  6. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro.egg-info/requires.txt +1 -0
  7. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/LICENSE +0 -0
  8. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/MANIFEST.in +0 -0
  9. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/README.md +0 -0
  10. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/setup.cfg +0 -0
  11. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/__init__.py +0 -0
  12. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/db/MongoDB.py +0 -0
  13. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/db/MysqlDB.py +0 -0
  14. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/db/RedisDB.py +0 -0
  15. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/db/__init__.py +0 -0
  16. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/__init__.py +0 -0
  17. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/cli.py +0 -0
  18. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/.gitignore +0 -0
  19. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/Dockerfile +0 -0
  20. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/README.md +0 -0
  21. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/__init__.py +0 -0
  22. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/app/__init__.py +0 -0
  23. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/app/api/__init__.py +0 -0
  24. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/app/api/v1/__init__.py +0 -0
  25. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/app/api/v1/demo.py +0 -0
  26. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/app/app.py +0 -0
  27. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/app/config/__init__.py +0 -0
  28. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/app/config/secure.py +0 -0
  29. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/app/config/setting.py +0 -0
  30. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/app/libs/__init__.py +0 -0
  31. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/app/libs/base.py +0 -0
  32. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/app/libs/error.py +0 -0
  33. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/app/libs/error_code.py +0 -0
  34. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/app/libs/redprint.py +0 -0
  35. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/app/libs/token_auth.py +0 -0
  36. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/app/models/__init__.py +0 -0
  37. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/app/models/base.py +0 -0
  38. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/app/models/redis_demo.py +0 -0
  39. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/app/validators/__init__.py +0 -0
  40. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/app/validators/base.py +0 -0
  41. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/app/validators/demo.py +0 -0
  42. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/docker-compose.yml +0 -0
  43. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/logs/__init__.py +0 -0
  44. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/obj/__init__.py +0 -0
  45. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/requirements.txt +0 -0
  46. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/server_run.py +0 -0
  47. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/test/__init__.py +0 -0
  48. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/flask_demo/templates/uwsgi.ini +0 -0
  49. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/proxy/XiaoXiangProxy.py +0 -0
  50. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/proxy/__init__.py +0 -0
  51. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/proxy/proxy.py +0 -0
  52. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/task_pro/__init__.py +0 -0
  53. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/task_pro/go_fun_air_v1.py +0 -0
  54. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/task_pro/go_fun_v3.py +0 -0
  55. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/tools.py +0 -0
  56. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/utils/__init__.py +0 -0
  57. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/utils/audio_video.py +0 -0
  58. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/utils/crypto.py +0 -0
  59. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/utils/crypto_pro.py +0 -0
  60. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/utils/file_utils.py +0 -0
  61. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/utils/helpers.py +0 -0
  62. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/utils/log.py +0 -0
  63. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/utils/retry.py +0 -0
  64. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/utils/set_data.py +0 -0
  65. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/utils/shell.py +0 -0
  66. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/utils/sql.py +0 -0
  67. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro/utils/time_utils.py +0 -0
  68. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro.egg-info/dependency_links.txt +0 -0
  69. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro.egg-info/entry_points.txt +0 -0
  70. {xtn-tools-pro-1.0.1.3.2 → xtn-tools-pro-1.0.1.3.4}/xtn_tools_pro.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: xtn-tools-pro
3
- Version: 1.0.1.3.2
3
+ Version: 1.0.1.3.4
4
4
  Summary: xtn 开发工具
5
5
  Author: xtn
6
6
  Author-email: czw011122@gmail.com
@@ -15,7 +15,7 @@ with open("README.md", "r") as f:
15
15
 
16
16
  setuptools.setup(
17
17
  name="xtn-tools-pro", # 模块名称
18
- version="1.0.1.3.2", # 版本
18
+ version="1.0.1.3.4", # 版本
19
19
  author="xtn", # 作者
20
20
  author_email="czw011122@gmail.com", # 作者邮箱
21
21
  description="xtn 开发工具", # 模块简介
@@ -45,7 +45,8 @@ setuptools.setup(
45
45
  "pyotp",
46
46
  # "moviepy",
47
47
  "pycryptodome",
48
- "requests"
48
+ "requests",
49
+ "psutil"
49
50
  ],
50
51
  python_requires='>=3.7',
51
52
  entry_points={
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ # 说明:
5
+ # win 操作
6
+ # History:
7
+ # Date Author Version Modification
8
+ # --------------------------------------------------------------------------------------------------
9
+ # 2025/8/11 xiatn V00.01.000 新建
10
+ # --------------------------------------------------------------------------------------------------
11
+ import psutil
12
+ import ctypes
13
+ from ctypes import wintypes
14
+
15
+ user32 = ctypes.WinDLL("user32", use_last_error=True)
16
+
17
+ # 回调类型:BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
18
+ EnumWindowsProc = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM)
19
+
20
+ # --- 明确声明所有用到的 WinAPI 的参数/返回类型 ---
21
+ user32.EnumWindows.argtypes = [EnumWindowsProc, wintypes.LPARAM]
22
+ user32.EnumWindows.restype = wintypes.BOOL
23
+
24
+ user32.GetWindowThreadProcessId.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.DWORD)]
25
+ user32.GetWindowThreadProcessId.restype = wintypes.DWORD
26
+
27
+ user32.IsWindowVisible.argtypes = [wintypes.HWND]
28
+ user32.IsWindowVisible.restype = wintypes.BOOL
29
+
30
+ user32.GetWindowTextLengthW.argtypes = [wintypes.HWND]
31
+ user32.GetWindowTextLengthW.restype = ctypes.c_int # 长度(TCHAR 数),可能为 0
32
+
33
+ user32.GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int]
34
+ user32.GetWindowTextW.restype = ctypes.c_int # 实际拷贝的字符数
35
+
36
+
37
+ def enum_windows(only_visible=True):
38
+ """
39
+ 遍历顶层窗口,返回 [{hwnd, pid, title}, ...]
40
+ - only_visible=True 只返回可见窗口
41
+ """
42
+ results = []
43
+
44
+ @EnumWindowsProc
45
+ def callback(hwnd, lparam):
46
+ try:
47
+ # 可选过滤
48
+ if only_visible and not user32.IsWindowVisible(hwnd):
49
+ return True # 继续枚举
50
+
51
+ # 取 PID
52
+ pid = wintypes.DWORD(0)
53
+ user32.GetWindowThreadProcessId(hwnd, ctypes.byref(pid))
54
+
55
+ # 取标题
56
+ length = user32.GetWindowTextLengthW(hwnd)
57
+ title = ""
58
+ if length > 0:
59
+ buf = ctypes.create_unicode_buffer(length + 1)
60
+ copied = user32.GetWindowTextW(hwnd, buf, length + 1)
61
+ if copied > 0:
62
+ title = buf.value
63
+
64
+ # 结果里再把 HWND 规范化为无符号整数,避免负数显示
65
+ results.append({
66
+ "hwnd": ctypes.c_size_t(hwnd).value,
67
+ "pid": pid.value,
68
+ "title": title
69
+ })
70
+ except Exception:
71
+ # 回调里不要把异常抛给 WinAPI,否则会出现 “Exception ignored on calling ctypes callback function”
72
+ pass
73
+ return True # 继续
74
+
75
+ user32.EnumWindows(callback, 0)
76
+ return results
77
+
78
+
79
+ def kill_process_by_name(process_name, x=False):
80
+ """
81
+ 遍历根据进程名杀死所有相关进程
82
+ :param process_name:
83
+ :return:
84
+ """
85
+ for proc in psutil.process_iter(['pid', 'name']):
86
+ try:
87
+ if proc.info['name'] and process_name.lower() in proc.info['name'].lower():
88
+ if x:
89
+ print(f"Killing process: {proc.info['name']} (PID: {proc.info['pid']})")
90
+ proc.kill()
91
+ except (psutil.NoSuchProcess, psutil.AccessDenied):
92
+ continue
93
+
94
+
95
+ if __name__ == "__main__":
96
+ pass
97
+ # 枚举win窗口获取句柄和pid
98
+ # for win in enum_windows(only_visible=True):
99
+ # print(win)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: xtn-tools-pro
3
- Version: 1.0.1.3.2
3
+ Version: 1.0.1.3.4
4
4
  Summary: xtn 开发工具
5
5
  Author: xtn
6
6
  Author-email: czw011122@gmail.com
@@ -64,4 +64,5 @@ xtn_tools_pro/utils/retry.py
64
64
  xtn_tools_pro/utils/set_data.py
65
65
  xtn_tools_pro/utils/shell.py
66
66
  xtn_tools_pro/utils/sql.py
67
- xtn_tools_pro/utils/time_utils.py
67
+ xtn_tools_pro/utils/time_utils.py
68
+ xtn_tools_pro/utils/win.py
@@ -11,3 +11,4 @@ fabric
11
11
  pyotp
12
12
  pycryptodome
13
13
  requests
14
+ psutil