冬至雨 发表于 2024-7-22 10:51

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)
}


想监控什么关键字,自己填写吧!实测非常管用,下一步把他弄成安卓,苹果手机里!

让他永远玩不了游戏,打开就关闭!!!

欢迎大家补全更多的功能!!

luliucheng 发表于 2024-7-22 14:23

冬至雨 发表于 2024-7-22 11:32
不能仅仅是win,下下一步安卓,苹果,鸿蒙,都给他禁用了!必须禁用,所有游戏!!!

楼主的精神可嘉,但是这种软件压根就不可能跨平台,因为不同平台的接口不一样,应用包格式不一样,系统限制也不一样。你以为手机系统也只要一句 WM_CLOSE 就能关掉“窗口”了?而且关键字屏蔽终究是一个无底洞,如果对信息相关知识有所了解就会知道网上的信息是无穷多的,而关键字的覆盖面再怎么大都是有限的,关键字屏蔽本质上就是一场猫捉老鼠的游戏,永远不会结束。(我之前做过水贴拦截深有体会)更何况现在这个程序就有数不清的漏洞:Firefox浏览器不会被关闭,搜索“youxi”不会被关闭,直接搜游戏的名字不会关闭……但凡会用任务管理器这个程序就被关了
{:301_1009:}
希望楼主戒骄戒躁,脚踏实地,努力学习计算机和算法知识,提升编程素养,更加全面的考虑问题。

怪Guai 发表于 2024-7-22 10:57

哦哟 有点狠,堵不如疏,支持一下

newlifes24 发表于 2024-7-22 11:04

微软自带的家庭管理账号,可以限制所有。

cl19980429 发表于 2024-7-22 11:05

测试一下, 看行不行

amex0372 发表于 2024-7-22 11:17

哈哈哈,牛皮

marcoxin998 发表于 2024-7-22 11:23

我娃要是喜欢打游戏,我带他打WOW,魂系这些,王者原神不给他玩

冬至雨 发表于 2024-7-22 11:32

newlifes24 发表于 2024-7-22 11:04
微软自带的家庭管理账号,可以限制所有。

不能仅仅是win,下下一步安卓,苹果,鸿蒙,都给他禁用了!必须禁用,所有游戏!!!

冬至雨 发表于 2024-7-22 11:34

cl19980429 发表于 2024-7-22 11:05
测试一下, 看行不行

必须行!只要你打开百度,搜游戏,就给你直接关闭!毫不犹豫!

Godjk 发表于 2024-7-22 11:38

孩子:有你真好

fxyc87 发表于 2024-7-22 11:43

还不如直接给电脑设个密码
页: [1] 2 3 4 5
查看完整版本: golang,编写的“游戏终结者”