删除文章

确定要删除这篇文章吗?

取消
确定

双击exe阻止程序启动

     阅读(100)  2019-12-03 09:22:56

有些程序不希望用户双击直接运行,而是由其他的程序调用启动。

根据main函数的传参可以简单的实现这个需求,用户双击运行的话参数argc为1,argv为程序运行的路径。

这里通过另外一种方法来实现,不依赖于传参。

  • 在main函数里获取父进程的ID
  • 判断父进程ID是否为explorer.exe进程ID
  • 如果是,表示是通过双击打开的

代码如下:

bool GetProcessInfo(PROCESSENTRY32 &info, const std::function<bool(const PROCESSENTRY32 &data)> &cb)
{
    bool result = false;
    info.dwSize = sizeof(PROCESSENTRY32);
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (Process32First(snapshot, &info)) {
        while (Process32Next(snapshot, &info)) {
            if (cb(info)) {
                result = true;
                break;
            }
        }
    }

    CloseHandle(snapshot);
    return result;
}

DWORD GetProcessIdByName(const WCHAR *name)
{
    PROCESSENTRY32 info;
    if (GetProcessInfo(info, [&](const PROCESSENTRY32 &data) -> bool {
        return wcsicmp(data.szExeFile, name) == 0;
    })) {
        return info.th32ProcessID;
    }
    return -1;
}

DWORD GetParentProcessId(DWORD pid)
{
    PROCESSENTRY32 info;
    if (GetProcessInfo(info, [&](const PROCESSENTRY32 &data) -> bool {
        return data.th32ProcessID == pid;
    })) {
        return info.th32ParentProcessID;
    }
    return -1;
}

// main.cpp
DWORD parentProcessId = GetParentProcessId(GetCurrentProcessId());
DWORD explorerProcessId = GetProcessIdByName(L"explorer.exe");
if (parentProcessId > 0 && parentProcessId == explorerProcessId) {
    // 不能双击启动
    return 0;
}

关键就是判断它的父进程ID是不是explorer.exe

文章评论

Keep it simple,stupid
文章数
306
总访问量
608494
今日访问
36
最近评论

liangzi : 不错 谢谢分享
tujiaw : registerThreadInactive:如果当前没有激活的线程,就去激活线程,让等待的线程去执行任务。
hgzzx : 佩服佩服。 请教:registerThreadInactive的作用是什么?
xuehaoyun : 很不错,来围观一下
tujiaw : 抱歉csdn code服务关闭了,这个代码我也找不到了
于淞 : 你好,这个文章的源码能分享一下吗,songsong9181@163.com,谢谢了 上面的写错了
于淞 : 你好,这个文章的源码能分享一下吗,838106303@163.com,谢谢了 上面的链接不能用了
tujiaw : 多谢多谢
essaypinglun college-paper.org : 很好的博客,赞赞
Folly : 这个实现有点奇怪,Qt为什么没有统一的比对方法。
回到顶部