golang,编写的“游戏终结者”
本帖最后由 冬至雨 于 2024-7-22 18:35 编辑斑竹尽然没有给Golang单独弄个“分类”,好吧,遵守斑竹的规定吧!
孩子寒暑假一直玩游戏,实在是太气人了,外游戏的动力,远远大于学习的动力!我搜了下52论坛没有限制游戏的软件,也没有限制游戏的开源代码!
为了孩子们的健康成长,用golang,写个小代码,把PC端所有的网游,页游,游戏,都给他屏蔽掉,还给孩子一个清朗的网络空间!
源码再次!
package main
import (
"fmt"
"strings"
"syscall"
"time"
"unsafe"
"github.com/shirou/gopsutil/process"
)
var (
user32 = syscall.NewLazyDLL("user32.dll")
procEnumWindows = user32.NewProc("EnumWindows")
procGetWindowTextW = user32.NewProc("GetWindowTextW")
procPostMessage = user32.NewProc("PostMessageW")
)
const (
WM_CLOSE = 0x0010
)
func EnumWindows(enumFunc uintptr, lParam uintptr) (err error) {
r1, _, e1 := syscall.Syscall(procEnumWindows.Addr(), 2, uintptr(enumFunc), uintptr(lParam), 0)
if r1 == 0 {
if e1 != 0 {
err = error(e1)
} else {
err = syscall.EINVAL
}
}
return
}
func GetWindowText(hwnd syscall.Handle, str *uint16, maxCount int32) (len int32, err error) {
r1, _, e1 := syscall.Syscall(procGetWindowTextW.Addr(), 3, uintptr(hwnd), uintptr(unsafe.Pointer(str)), uintptr(maxCount))
len = int32(r1)
if len == 0 {
if e1 != 0 {
err = error(e1)
} else {
err = syscall.EINVAL
}
}
return
}
func PostMessage(hwnd syscall.Handle, msg uint32, wParam, lParam uintptr) (err error) {
r1, _, e1 := syscall.Syscall6(procPostMessage.Addr(), 4, uintptr(hwnd), uintptr(msg), uintptr(wParam), uintptr(lParam), 0, 0)
if r1 == 0 {
if e1 != 0 {
err = error(e1)
} else {
err = syscall.EINVAL
}
}
return
}
func enumWindowsProc(hwnd syscall.Handle, lParam uintptr) uintptr {
const maxLen = 256
var buf uint16
_, err := GetWindowText(hwnd, &buf, maxLen)
if err == nil {
title := syscall.UTF16ToString(buf[:])
if containsGameKeywords(title) {
fmt.Printf("Closing window: %s\n", title)
PostMessage(hwnd, WM_CLOSE, 0, 0)
}
}
return 1
}
func containsGameKeywords(title string) bool {
keywords := []string{"游戏", "页游", "网游",
"手游",
"电竞",
"魔兽",
"迷你世界",
"精英",
"吃鸡",
"王者荣耀",
"和平精英",
"英雄联盟",
"穿越火线",
"绝地求生",
"堡垒之夜",
"使命召唤",
"守望先锋",
"魔兽世界",
"剑灵",
"梦幻西游",
"传奇",
"征途",
"天龙八部",
"问道",
"神武",
"大话西游",
"龙之谷",
"地下城与勇士",
"逆战",
"火影忍者",
"部落冲突",
"皇室战争",
"炉石传说",
"星际争霸",
"暗黑破坏神",
"魔域",
"传奇"}
for _, keyword := range keywords {
if strings.Contains(strings.ToLower(title), keyword) {
return true
}
}
return false
}
func main() {
go monitorBrowsers()
select {} // Keep the program running
}
func monitorBrowsers() {
for {
processes, err := process.Processes()
if err != nil {
fmt.Println("Error getting processes:", err)
continue
}
for _, p := range processes {
name, err := p.Name()
if err != nil {
continue
}
if isBrowserToBlock(name) {
fmt.Printf("Monitoring browser: %s\n", name)
monitorBrowserActivity(p)
}
}
time.Sleep(5 * time.Second) // Sleep for 5 seconds before next check
}
}
func isBrowserToBlock(name string) bool {
blockedBrowsers := []string{"firefox.exe", "opera.exe", "360se.exe", "chrome.exe", "iexplore.exe", "msedge.exe", "qqbrowser.exe"}
for _, browser := range blockedBrowsers {
if strings.EqualFold(name, browser) {
return true
}
}
return false
}
func monitorBrowserActivity(p *process.Process) {
// This function should monitor the browser activity and close it if it detects the keywords
// You can use Windows API or other tools to monitor the browser activity
// For simplicity, we just close the browser process if it contains the keywords in the window title
cb := syscall.NewCallback(enumWindowsProc)
EnumWindows(cb, 0)
}
想监控什么关键字,自己填写吧!实测非常管用,下一步把他弄成安卓,苹果手机里!
让他永远玩不了游戏,打开就关闭!!!
欢迎大家补全更多的功能!!
冬至雨 发表于 2024-7-22 11:32
不能仅仅是win,下下一步安卓,苹果,鸿蒙,都给他禁用了!必须禁用,所有游戏!!!
楼主的精神可嘉,但是这种软件压根就不可能跨平台,因为不同平台的接口不一样,应用包格式不一样,系统限制也不一样。你以为手机系统也只要一句 WM_CLOSE 就能关掉“窗口”了?而且关键字屏蔽终究是一个无底洞,如果对信息相关知识有所了解就会知道网上的信息是无穷多的,而关键字的覆盖面再怎么大都是有限的,关键字屏蔽本质上就是一场猫捉老鼠的游戏,永远不会结束。(我之前做过水贴拦截深有体会)更何况现在这个程序就有数不清的漏洞:Firefox浏览器不会被关闭,搜索“youxi”不会被关闭,直接搜游戏的名字不会关闭……但凡会用任务管理器这个程序就被关了
{:301_1009:}
希望楼主戒骄戒躁,脚踏实地,努力学习计算机和算法知识,提升编程素养,更加全面的考虑问题。 哦哟 有点狠,堵不如疏,支持一下 微软自带的家庭管理账号,可以限制所有。 测试一下, 看行不行 哈哈哈,牛皮 我娃要是喜欢打游戏,我带他打WOW,魂系这些,王者原神不给他玩 newlifes24 发表于 2024-7-22 11:04
微软自带的家庭管理账号,可以限制所有。
不能仅仅是win,下下一步安卓,苹果,鸿蒙,都给他禁用了!必须禁用,所有游戏!!! cl19980429 发表于 2024-7-22 11:05
测试一下, 看行不行
必须行!只要你打开百度,搜游戏,就给你直接关闭!毫不犹豫! 孩子:有你真好 还不如直接给电脑设个密码