吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1587|回复: 19
收起左侧

[已解决] 想不通压缩包程序和potplayer在windows右键菜单如何实现的

[复制链接]
onlyclxy 发表于 2022-11-10 13:34
本帖最后由 onlyclxy 于 2022-11-15 20:19 编辑

刚才有个大佬帮我找到了一个地址,解决这个问题挺完美的:
C#下使用SharpShell自定义桌面鼠标右键菜单,一次选择多个文件进行后续处理 - ryan1985 - 博客园 (cnblogs.com)
看样子是需要写什么shell. 顺便给贴出的外国大佬研究贴
.NET Shell Extensions - Shell Context Menus - CodeProject

不过咱也看不懂. 现在打算先学个c#把现在的功能给实现了



近几年写程序遇到一个右键菜单的问题
windows的右键菜单 可以传递一个 %1(自身全路径.) 到某个程序里,这个大佬们应该是知道的.
如果一次性选择多个文件, 执行右键菜单传递%1, 会同时打开多个程序分别传递每个路径, 并不是多个文件的路径一起传递给一个程序. 这是前提,并且 很麻烦
我看网上的解决方案,是做一个消息传递,后开的程序,把路径传给第一个程序后关闭自身. 这样虽然能解决问题,但是程序不可以多开了,也挺麻烦.

如果上面我描述的不清楚,我举个例子:
比如我电脑有100个记事本, 我全选,点右键用记事本打开. 那么会打开100个记事本窗口,
比如有100个视频,我全选, 用potplayer播放, 那么并不是打开100个potplayer, 而是用1个potplayer添加了这100个视频的路径到列表里
压缩包也是. 我选中100个文件,右键添加到压缩文件, 不是同时打开了100个压缩窗口分别压缩每一个文件, 而是只出现了一个压缩窗口,压缩了100个文件.

假如说potplayer和压缩包也是用了消息传递. 后续打开的窗口把路径传给第一个窗口并且关闭了自身,  那么他就不可以多开(因为后续开的要自动关闭). 但是奇怪的是, 他又可以多开.

比如还是这100个视频, 我右键用potplayer播放,  出现一个播放器, 紧接着我又继续重复点右键,再次执行播放,这样会再出现一个播放器, 而不是说第二次点播放的,在第一个播放窗口播放.(这种感觉又不像消息传递)
压缩包也是同理.右键选中100个文件添加到压缩包,  出现一个压缩窗口, 紧接着我又继续重复点右键,再次执行添加到压缩包,这样会再出现一个压缩窗口, 而不是说第二次点添加到压缩的,第一个窗口多了一倍的路径.
这就超出了我的理解范畴了...
遂来请示看看有没有懂这个的大佬.  像他们这种,大概率是怎么实现的?

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

M0nster 发表于 2022-11-10 13:42
还从来没想过这个问题,插个眼关注一下结果

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
onlyclxy + 1 + 1 找到了外网的解决方案.. 但是不是专业程序.也不会弄了. 就先能凑合就凑合吧

查看全部评分

Joe1921567817 发表于 2022-11-10 13:49
好问题,我只知道n个多文件拖拽的时候参数是分别在%1~%n的,比如 Python 多个文件拖拽的时候就可以用for arg in sys.argv[1:]:循环处理每个文件(因为sys.argv[0]是自身路径,因此循环的时候就刨去它)但是多文件右键我还真没研究过

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
onlyclxy + 2 + 1 感谢大佬指点. 又学到一个python的知识点哈哈哈!!

查看全部评分

冥界3大法王 发表于 2022-11-10 13:50
zhzhch335 发表于 2022-11-10 14:47
em……确实一下想不到是怎么处理的 插眼等结果 有大佬出现了踢我一脚

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
onlyclxy + 1 + 1 找到了外网的解决方案.. 但是不是专业程序.也不会弄了. 就先能凑合就凑合吧

查看全部评分

boxer 发表于 2022-11-10 15:38
本帖最后由 boxer 于 2022-11-10 15:42 编辑

其实非常简单, 是你自己想得太复杂而已,并且实现也非常容易
如果一次性选择多个文件, 执行右键菜单传递%1, 会同时打开多个程序分别传递每个路径, 并不是多个文件的路径一起传递给一个程序.

这个理解不对,其实是后者,实现这些操作是程序自己处理命令行参数完成的, 我以potplayer为例说明它的操作:
当你选择一个或者多个文件然后右键->"用 potPlayer播放(P)"后, 会先运行DTDrop64.exe(32位的是DTDrop.exe),这个程序主要功能是判断选择是一个或者多个文件,如果是一个就直接启动potPlayer 并传文件路径给它来播放,如果是多个就先生成一个"C:\Users\你的用户名\AppData\Local\Temp\PotPlayer.m3u"的文件并写入选择的文件路径, 一行一个,然后启动potPlayer并传这个路径给它,主程序就会打开列表并播放第一个

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
onlyclxy + 2 + 1 热心回复!先感谢大佬分析!

查看全部评分

 楼主| onlyclxy 发表于 2022-11-10 15:56
boxer 发表于 2022-11-10 15:38
其实非常简单, 是你自己想得太复杂而已,并且实现也非常容易

这个理解不对,其实是后者,实现这些操作是程 ...

谢谢大佬的指路,思路有点清晰了.然后就是怎么判断是传递了多个文件呢?
补充一下我自己之前测试的结果. 就是如果直接拖动几个文件到一个程序上, 或者用发送到一次发几个文件到这个程序上. 那么这个程序可以通过获取命令行数组的方式来判断有几个文件.
就那个%1好像是单独的文件. 首先我不清楚%1这个能否也能传递数组? 还是有别的参数可以传递数组类型的路径, 来让程序知道有多文件传过来了?
boxer 发表于 2022-11-10 16:02
onlyclxy 发表于 2022-11-10 15:56
谢谢大佬的指路,思路有点清晰了.然后就是怎么判断是传递了多个文件呢?
补充一下我自己之前测试的结果.  ...

系统传来的是字符串,不是数组,结果是目标程序解析的,每个文件都有引号括起来, 文件之间用一个空格分隔, 自己解析是很简单的
知心 发表于 2022-11-10 16:20
onlyclxy 发表于 2022-11-10 15:56
谢谢大佬的指路,思路有点清晰了.然后就是怎么判断是传递了多个文件呢?
补充一下我自己之前测试的结果.  ...

你可以自己写一个程序尝试一下楼上说的运行过程。这样应该会更容易理解
心中的沉默 发表于 2022-11-10 16:25
易语言我知道,以前研究过一下,原理应该都差不多,可以通用
大概意思就是,程序写两个子程序,一个子程序取启动参数,也就是%1,取到路径后中如果检测到程序正在运行,那么把路径传递给正在运行的程序,写一个子程序接收消息,然后结束自己,这是一种思路。
实际上可以实现的方法应该有很多,主要看写程序的思路。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-28 22:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表