-
Notifications
You must be signed in to change notification settings - Fork 31
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
【求助】使用Python脚本如何获取Windows中选中的文本 #38
Comments
在报名三期之前有看过二期的一些资料 这两天在看同学陆续提交入学任务的时候也发现有同学碰到了windows操作系统下环境变量的坑,于是想着用Python做一个脚本轻松简便的将路径设置为用户的环境变量。 想法是这样的:用户在windows资源管理器地址栏中,选中路径文本后右键弹出菜单项“加入到当前用户的PATH环境变量”,单击该菜单即完成环境变量的设置 分解任务: 任务1.在windows的资源管理器中选中路径或选中一个目录 任务2.获取选中的路径文本或当前目录所在路径的字符串 任务3.右键为系统添加一个右键菜单项“加入到当前用户的PATH环境变量”,同时弹出菜单 任务4.执行设置环境变量脚本 以上4个任务中,第1个选中文本的任务可以由操作系统完成,后面3个任务需要编程 先来做第4个任务。 将第4个任务进行细分 4.1 取出当前环境变量PATH的值 环境变量属于系统级的东西,于是想到python中的os模块应该有相应的方法可以用。 打开python官方文档搜索os模块,找到两个函数,一个是获取环境变量os.getenv(),一个是设置环境变量os.putenv(),果断用上先 少废话,上代码 version 1.0
最后一句打印出来的path的值始终没有新增的那条路径,也就是说putenv设置没有成功。 |
打开windows查看环境变量,发现path的值没有发生变化,于是再去文档中查看putenv函数,发现有这么一句话 Such changes to the environment affect subprocesses started with os.system(), popen() or fork() and execv(). 这个变化会影响到以os.system(), popen() or fork() and execv()开启的子进程 不太明白啥意思,反正跟进程什么鬼有关系,感觉可能需要更新os.environ才会起作用 所以在准备尝试通过修改os.environ的值来设置为环境变量path设置值 少废话,上代码 version 1.1
这下简单多了,但是最后发现跟1.0版本一样的现象,还是没法更改windows环境变量PATH的值。 此时有点困惑了,这到底咋回事,为什么不起作用的? |
只能再用google搜了 发现一段话,也许可能大概差不多解释了不起作用的原因
没办法了,只能出大招了。 最终,考虑到在规划的任务中第3个任务需要修改注册表值以添加右键菜单,于是想到也许环境变量也可以通过修改注册表来实现,简单、暴力 在网上搜索python操作注册表的模块,还真有。 python有一个内置模块_winreg可以用来操作注册表。 工具有了,下面来了解操作方法,操作之前得先了解环境变量在注册表中的位置、键值等等信息 搜索一通,找到了位置
少废话,上代码 version 1.2
执行后,SetValueEx一直抛异常,不知是什么原因 搜索一通,将OpenKey函数换成CreateKey函数后执行正常,PATH的值发生了变化 对比两个函数
网上说这个可能跟_winreg模块与系统之间的配合有关系 再优化一下version 1.2 version 1.2.1
至此,任务4(设置环境变量的脚本)算是有了影。 |
重新屡一下需要编程实现的点 1.编程查找注册表特定位置添加键值 2.右键菜单执行脚本2生成的exe文件实现添加环境变量PATH的值 由于脚本2已基本完工,所以先将脚本2生成exe文件,以便能在windows上运行。 搜索发现cx-freeze模块可以干这个事,使用 生成exe需要在脚本2所在目录再新增一个setup.py脚本 访问cx-Freeze的官方文档,上面有setup.py的模板,复制下来
将setup函数的参数修改为自己的信息,必须要修改的地方是 脚本2和setup.py都已经准备好。 命令行中输入命令
在脚本所在的目录中会生成两个文件夹 dist目录中有一个生成的安装文件 双击安装,默认路径安装完成后,在C盘下能找到安装后的可执行exe程序 验证是否可以成功执行,复制一条待设置环境变量的路径到剪贴板 执行生成的exe,查看环境变量PATH值的变化 PATH值的末尾新增了刚刚复制的一条路径,说明exe执行成功。 |
截至目前,整个任务还剩下 现在就来实现添加右键菜单的功能。 考虑后,决定将右键菜单项添加到所有文件和文件夹的右键菜单中。 经过搜索,文件和文件夹的右键菜单位于注册表 HKEY_CLASSES_ROOT\AllFilesystemObjects\shell下 要想右键菜单执行指定的文件,需在shell下设置好菜单项后在其下新建command键,并将指定的文件路径赋值给command的值 依然使用_winreg模块来操作注册表 CreateKeyEx函数用于打开已存在的或新建一个键 SetValueEx函数用于为键设定一个值 少废话,上代码
执行代码后,打开注册表 注册表更新成功。再看右键菜单效果 右键菜单添加成功。 |
优化 1.PATH中已有的路径不再添加 version 2.0
最终,实现这个设置环境变量的功能需要安装一个文件,执行一个脚本 |
总结 原本以为很简单的‘获取选中的文本’的功能却卡了很长时间,到现在心里面还有影子在。 通过一系列的搜索发现这个获取选中文本的功能有更专业的名词来表达,如“屏幕划词”、“鼠标划词”、“鼠标取词”等,在一些翻译软件中,这是很基础的一个功能。 用到的主要模块 _winreg:操作windows注册表 了解了 windows注册表结构 小技巧 python弹出提示消息框 |
请问是怎么实现选中文本的啊 |
Title:使用Python脚本如何获取Windows中选中的文本
背景
在任意位置选中文本后,通过右键菜单获取这段选中的文本
到时我会加入一个右键菜单项,功能就是获取已选中的文本,类似复制功能,复制后保存到剪贴板中,但我会用一个变量来接收这段选中的字符串
Windows 7、Windows XP
现象
我想实现上述效果/目的时,遇到了这样的情况:
分析
我已经做了以下尝试:
尝试 0:
尝试 1:
尝试 2:
方案
我推测可以有以下几种解决方案,请问大家哪种思路正确,或有其它思路建议?
卡在这两天了,请同学们帮忙看下。
若有可能,还请指出我在上述分析问题和解决思路过程中的bug,多谢啦。。。
The text was updated successfully, but these errors were encountered: