Board logo

标题: [文件操作] bat 能否实现给F1-F10,快速粘贴设置好的路径? [打印本页]

作者: jack2020    时间: 2024-9-14 09:49     标题: bat 能否实现给F1-F10,快速粘贴设置好的路径?

本帖最后由 jack2020 于 2024-9-18 10:39 编辑

bat 能否实现给F1-F10赋值指定路径
多年一直用一个叫多功能剪切板的小软件,可以把电脑指定路径赋值给F1、F2、F3~F10,但是每次都要手动粘贴路径到软件窗口,有点麻烦。
然后每次在可编辑窗口按下F1或者F2,或者其他键,可以把预设的路径粘贴出来。

比如赋值:
F1路径为:C:\01_项目AA2024\15_广西ABC2024\03_AAA资料0914
F2路径为:D:\01_项目B2024\15_广西A2024\03_AA资料0914
F3路径为:E:\01_项目DDD2024\15_广西B2024\03_BCDEFG资料0914
按下键盘F1,自动把C:\01_项目AA2024\15_广西ABC2024\03_AAA资料0914 路径粘贴出来。
按下键盘F2,自动把D:\01_项目B2024\15_广西A2024\03_AA资料0914路径粘贴出来。
按下键盘F3,自动把E:\01_项目DDD2024\15_广西B2024\03_BCDEFG资料0914路径粘贴出来

求助大佬,能否用bat实现这一功能。
快速粘贴设置好的路径。

这里有原始代码,求会编程的大佬,重新编译一下,加写个ini配置文件可以自己读取ini文件,ini文本中可以自己手动修改F1-F10的地址,来实现这个功能?
多功能剪切板.e
多功能剪切板.e  源代码下载地址:
https://www.123pan.com/s/CTVA-40mIh
作者: ppll2030    时间: 2024-9-14 10:58

把文件保存为vbs,跟程序放一块运行即可。
  1. set ws = createobject("wscript.shell")
  2. ws.run ("多功能剪切板.exe")
  3. wscript.sleep 1000
  4. ws.appactivate("多功能剪切板")
  5. ws.sendkeys "c:\11" 'F1的快捷路径
  6. ws.sendkeys "~{TAB}"
  7. ws.sendkeys "c:\22" 'F2的快捷路径
  8. ws.sendkeys "~{TAB}"
  9. ws.sendkeys "c:\33"
  10. ws.sendkeys "~{TAB}"
  11. wscript.sleep 1000
  12. ws.sendkeys "% n" '输入完成,最小化多功能窗口
  13. wscript.quit
复制代码

作者: jack2020    时间: 2024-9-14 12:17

回复 2# ppll2030

谢谢!
路径是普通的数字 英文路径可以识别,但是路径带这个汉字和下划线,识别为乱码,大佬可以修正一下吗?

比如这个路径:F1赋值   E:\01_项目2024\15_广西2024\03_资料0914
多功能剪切板识别为F1:   E:\01_/2024\15_2024\03_0914
文件夹带汉字的全掉了
vbs文本编码格式是ANSI,换其他格式启动不了。
作者: Five66    时间: 2024-9-14 14:54

sendkeys貌似send不了中文,只能将中文放进windows剪贴板,然后ctrl+v,不过这样也可能会出现很多其他问题(例如剪贴板数据可能不匹配和被替换,时间对不上会粘贴到上一次的内容)
作者: jack2020    时间: 2024-9-14 15:03

回复 4# Five66

或者有没有其他bat代码实现这个功能,不用这个多功能剪切板软件 ,仅用  把F1-F10赋值10个不同的带汉字的电脑文件夹路径  启动BAT之后,按下F1或者其他键,可以粘贴出对应路径?
作者: czjt1234    时间: 2024-9-14 15:18

你说清楚,到底是要把路径输入到这个程序里,还是要把程序里已设置好的路径复制出来以便到其它地方粘贴?
作者: ppll2030    时间: 2024-9-14 15:30

本帖最后由 ppll2030 于 2024-9-14 15:31 编辑

把代码保存为bat文件,
地址列表就根据你自己的情况修改吧。
注意:16行的 more +21的数值一定要与地址列表行号对应。
  1. @echo off&setlocal enabledelayedexpansion
  2. (echo set ws = createobject("wscript.shell"^)
  3. echo N = WScript.Arguments(0^)
  4. echo ws.appactivate("多功能剪切板"^)
  5. echo wscript.sleep 500
  6. echo For i = 1 To N-1
  7. echo     ws.SendKeys "{TAB}"
  8. echo Next
  9. echo ws.sendkeys "^v"
  10. echo wscript.sleep 500
  11. echo ws.sendkeys "{TAB}"
  12. echo wscript.quit)>$.vbs
  13. start "" "多功能剪切板.exe"
  14. rem 注意 +21 这个数值与下面的 “地址列表:”的行数一致。否则取数会出错
  15. for /f "delims=" %%i in ('more +21 %~f0') do (
  16. set/a n+=1&echo %%i | clip &cscript //NoLogo $.vbs !n!
  17. )
  18. del $.vbs&exit/b
  19. 地址列表:
  20. E:\01_项目2024\15_广西2024\03_资料0914
  21. E:\02_项目2024\15_北京2024\03_资料0914
  22. E:\03_项目2024\15_西安2024\03_资料0914
复制代码

作者: jack2020    时间: 2024-9-14 15:42

回复 6# czjt1234


    是后面一种
作者: flashercs    时间: 2024-9-14 15:45

保存为1.bat, ANSI编码.
  1. <#*,:
  2. @echo off
  3. cd /d "%~dp0"
  4. set "batchfile=%~f0"
  5. Powershell -ExecutionPolicy Bypass -C "Set-Location -LiteralPath ([Environment]::CurrentDirectory);. ([ScriptBlock]::Create([IO.File]::ReadAllText($env:batchfile,[Text.Encoding]::GetEncoding(0) )) )"
  6. exit /b
  7. #>
  8. Add-Type -AssemblyName System.Windows.Forms, Microsoft.VisualBasic
  9. $proc = Start-Process -FilePath "多功能剪切板.exe" -PassThru
  10. [Microsoft.VisualBasic.Interaction]::AppActivate($proc.Id)
  11. # Start-Sleep -Milliseconds 1000
  12. [System.Windows.Forms.SendKeys]::SendWait("E:\01_项目2024\15_广西2024\03_资料0914") # F1的快捷路径
  13. [System.Windows.Forms.SendKeys]::SendWait("~{TAB}")
  14. [System.Windows.Forms.SendKeys]::SendWait("E:\22\01_项目2024\15_广西2024\03_资料0914") # F2的快捷路径
  15. [System.Windows.Forms.SendKeys]::SendWait("~{TAB}")
  16. [System.Windows.Forms.SendKeys]::SendWait("E:\33\中文abc") # F3的快捷路径
  17. [System.Windows.Forms.SendKeys]::SendWait("~{TAB}")
  18. Start-Sleep -Milliseconds 500
  19. [System.Windows.Forms.SendKeys]::SendWait("% n")
复制代码

作者: jack2020    时间: 2024-9-14 15:54

回复 9# flashercs


    好像无法启动
多功能剪切板.exe
作者: 77七    时间: 2024-9-14 15:54

放弃小工具,直接用autohotkey可能比较简单 试着写了一个

  1. f1::send, E:\01_项目2024\15_广西2024\03_资料0914
  2. f2::send, E:\02_项目2024\15_北京2024\03_资料0914
  3. f3::send, E:\03_项目2024\15_西安2024\03_资料0914
  4. return
复制代码

作者: jack2020    时间: 2024-9-14 15:56

回复 7# ppll2030


    +21是怎么看   这个路径 E:\01_项目2024\15_广西2024\03_资料0914中的数字和文字个数吗 能启动 好像没有自动填表呀
作者: jack2020    时间: 2024-9-14 15:57

回复 11# 77七


    这个是什么语言,求具体用法?
作者: 77七    时间: 2024-9-14 15:58

回复 13# jack2020


   11楼蓝色字体链接,安装后把代码保存为 1.ahk,执行
作者: czjt1234    时间: 2024-9-14 16:06

win11_22h2 测试通过
  1. @echo off
  2. :loop
  3. set /p s=请输入一个数字,按回车键退出
  4. if %s%==1 goto :c1
  5. if %s%==2 goto :c2
  6. exit
  7. :c1
  8. set "s=E:\01_项目2024\15_广西2024\03_资料0914"
  9. mshta.exe vbscript:ClipboardData.SetData("text","%s%")(close)
  10. echo 已复制 %s%
  11. echo,
  12. goto :loop
  13. :c2
  14. set "s=E:\01_项目2024\"
  15. mshta.exe vbscript:ClipboardData.SetData("text","%s%")(close)
  16. echo 已复制 %s%
  17. echo,
  18. goto :loop
复制代码

作者: ppll2030    时间: 2024-9-14 16:11

本帖最后由 ppll2030 于 2024-9-14 16:42 编辑

回复 [url=http:bbs.bathome.net/redirect.php?goto=findpost&pid=284203&ptid=69763]12#[/url] jack2020



行数就是从代码第一行开始往下数的数字。
如果你灭有改动代码,直接复制保存的。
那就只要修改地址列表下的内容就可以了。

这个脚本还是往你的软件里填写路径而已,不是直接赋值给F1-F12
运行脚本, 可以启动你的软件,并自动往你的软件内一次填写F1-F12的地址内容,之后依然是你原来用法
地址内容就是脚本内的地址列表。

地址列表:
C:\01_项目AA2024\15_广西ABC2024\03_AAA资料0914           (F1路径)
D:\01_项目B2024\15_广西A2024\03_AA资料0914                   (F2路径)
E:\01_项目DDD2024\15_广西B2024\03_BCDEFG资料0914       (F3路径)
。。。。。。。。
以此类推
替换路径的时候,( )的内容不需要放到脚本里
作者: jack2020    时间: 2024-9-14 16:16

回复 15# czjt1234

比如赋值:
F1路径为:C:\01_项目AA2024\15_广西ABC2024\03_AAA资料0914
F2路径为:D:\01_项目B2024\15_广西A2024\03_AA资料0914
F3路径为:E:\01_项目DDD2024\15_广西B2024\03_BCDEFG资料0914
按下键盘F1,自动把C:\01_项目AA2024\15_广西ABC2024\03_AAA资料0914 路径粘贴出来。
按下键盘F2,自动把D:\01_项目B2024\15_广西A2024\03_AA资料0914路径粘贴出来。
按下键盘F3,自动把E:\01_项目DDD2024\15_广西B2024\03_BCDEFG资料0914路径粘贴出来
   
我是想达到这个目的
作者: czjt1234    时间: 2024-9-14 16:20

我的批处理是数字键1234567890,不是F1F2...F10
批处理里举例说明的是按1和按2,在win7和win11测试通过,可以在其它地方粘贴指定的文本

难道你是要自动粘贴到其它地方?而不是自动复制+手动粘贴?
作者: aloha20200628    时间: 2024-9-14 16:23

本帖最后由 aloha20200628 于 2024-9-14 16:50 编辑

回复 5# jack2020

用过资源管理器的 ‘复制路径’ 右键菜单吗
在资源管理器中任意选择多个路径后直接右键点击  ‘复制路径’ 即可将选择结果自动送入剪贴板以便后续粘贴...

作者: czjt1234    时间: 2024-9-14 16:34

回复 17# jack2020


我的理解是, 按 F1 后,会复制 程序中 F1 旁边的方框里的自己已经设置好的文本
然后你可以到其它地方手动粘贴
作者: ppll2030    时间: 2024-9-14 21:15

有空了,我还是再改一版吧,这个应该够简洁明了。
代码保存为run.bat,再新建一个空白的文本“地址列表.txt”,这两个文件跟你的多功能剪切板程序放在一起。
然后把你需要定义的F1-F10的路径直接复制到“地址列表.txt”文本里面。一行一个路径。
使用的时候直接运行run.bat,就可以自动把地址列表里的路径都自动添加到软件里,实现快速定义F1-F10了。
脚本在定义路径后,可以自动最小化程序,默认没开启,需要的自己改一下,去掉::就可以了。
  1. @echo off&setlocal enabledelayedexpansion
  2. (echo set ws = createobject("wscript.shell"^)
  3. echo N = WScript.Arguments(0^)
  4. echo ws.appactivate("多功能剪切板"^)
  5. echo wscript.sleep 500
  6. echo For i = 1 To N-1
  7. echo     ws.SendKeys "{TAB}"
  8. echo Next
  9. echo ws.sendkeys "^v"
  10. echo wscript.sleep 500
  11. echo ws.sendkeys "{TAB}"
  12. echo wscript.quit)>$.vbs
  13. start "" "多功能剪切板.exe"
  14. for /f "delims=" %%i in (地址列表.txt) do (
  15. set/a n+=1&echo %%i | clip &cscript //NoLogo $.vbs !n!
  16. )
  17. rem 地址粘贴完成,把软件最小化,需要的可以把::去掉
  18. ::mshta vbscript:execute("Set A=CreateObject(""WScript.Shell""):a.appactivate""多功能剪切板"":A.sendkeys(""%% n""):close")
  19. del $.vbs&exit/b
复制代码

作者: jack2020    时间: 2024-9-14 23:57

回复 21# ppll2030
多谢大佬,按这个测试了两台电脑    run.bat  编码已经改成ANSI  
都是win10的  一台读取之后写入软件   F1:变成  C:\01_椤圭洰AA2024\15_骞胯タABC2024\03_AAA璧勬枡0914
                                                  F2:变成  D:\01_椤圭洰B2024\15_骞胯タA2024\03_AA璧勬枡0914
                                                  F3:变成  E:\01_椤圭洰DDD2024\15_骞胯タB2024\03_BCDEFG璧勬枡0914
代码是直接拷过来的  完全一样
不知道是不是缺字体
另外一台启动之后没有填表,运行run.bat之后启动了多功能剪切板,没有填表,
但是在根目录下生成1个$.vbs文件,打开内容如下:
set ws = createobject("wscript.shell")
N = WScript.Arguments(0)
ws.appactivate("多功能剪切板")
wscript.sleep 500
For i = 1 To N-1
    ws.SendKeys "{TAB}"
Next
ws.sendkeys "^v"
wscript.sleep 500
ws.sendkeys "{TAB}"
wscript.quit
   不知道是不是缺函数。
作者: ppll2030    时间: 2024-9-15 00:48

本帖最后由 ppll2030 于 2024-9-15 00:59 编辑

回复 22# jack2020


    第一个问题,把地址列表也保存为ANSI编码格式。
第二个问题,运行后不填入地址,试试切换输入法,让其在英文输入法状态下运行试试吧。毕竟是模拟输入,输入法状态影响还是有的。
$.vbs 是临时文件,主要就是模拟键盘输入Ctrl+v粘贴,和TAB切换框框,运行成功后就会自动删除。
还有,运行的时候,不要使用鼠标和键盘。否则也会使模拟输入失效,出现第二个问题。
作者: jack2020    时间: 2024-9-18 10:31

回复 23# ppll2030


    第一台电脑,已经把地址列表已经保保存为ANSI编码格式。cup是12400,win10系统
   读取之后写入软件   F1:变成  C:\01_椤圭洰AA2024\15_骞胯タABC2024\03_AAA璧勬枡0914
                                                  F2:变成  D:\01_椤圭洰B2024\15_骞胯タA2024\03_AA璧勬枡0914
                                                  F3:变成  E:\01_椤圭洰DDD2024\15_骞胯タB2024\03_BCDEFG璧勬枡0914
代码是直接拷过来的  完全一样
不知道是不是缺字体



另外一台是i3 7500,win10系统
,输入法切换英文 中文都不填表。
不知道是不是缺函数


还是感谢大佬抽空写的代码,找不到原因,我还是手动填表拷贝吧  就是每次开机要重新拷贝一次。
作者: ppll2030    时间: 2024-9-18 11:00

本帖最后由 ppll2030 于 2024-9-18 11:05 编辑

回复 24# jack2020


    win10下同下,我能复现的原因就是图片所示。
所以还是再检查一下编码问题。
另一台机器不能复制,可能是系统精简过度?vbs脚本就没运行起来吧?


作者: ppll2030    时间: 2024-9-18 11:32

本帖最后由 ppll2030 于 2024-9-18 13:30 编辑

回复 24# jack2020


    如果修改编码格式不成功的,可以试试另一个办法。
把 多功能剪切板.exe 改为英文名字:MultiClipBoard.exe
把 地址列表.txt  改用英文名字:addlist.txt

然后复制下面的记事本,直接保存为bat文件即可。就用系统默认的UTF-8编码即可。addlist.txt也不用改编码,就用默认的。
  1. @echo off&setlocal enabledelayedexpansion
  2. chcp 936
  3. (echo set ws = createobject("wscript.shell"^)
  4. echo N = WScript.Arguments(0^)
  5. echo ws.appactivate("多功能剪切板"^)
  6. echo wscript.sleep 500
  7. echo For i = 1 To N-1
  8. echo     ws.SendKeys "{TAB}"
  9. echo Next
  10. echo ws.sendkeys "^v"
  11. echo wscript.sleep 500
  12. echo wscript.quit)>$.vbs
  13. chcp 65001
  14. start "" "MultiClipBoard.exe"
  15. for /f "delims=" %%i in (addlist.txt) do (
  16. set/a n+=1&echo %%i | clip &cscript //NoLogo $.vbs !n!
  17. )
  18. rem 地址粘贴完成,把软件最小化,需要的可以把::去掉
  19. ::mshta vbscript:execute("Set A=CreateObject(""WScript.Shell""):a.appactivate""多功能剪切板"":A.sendkeys(""%% n""):close")
  20. del $.vbs&exit/b
复制代码

作者: 77七    时间: 2024-9-18 12:18

提供一个,11楼小白版
1.下载autohotkey 地址 http://bcn.bathome.net/tool/AutoHotkey.exe
2.以下代码以 UTF-8 with BOM (带签名)编码,保存为 test.bat
3.将test.bat 和 autohotkey.exe 放在同一目录下,双击执行test.bat

  1. ;&cls &@echo off
  2. ;chcp 65001 >nul
  3. ;cd /d "%~dp0"
  4. ;start "" "AutoHotkey.exe" "%~f0"
  5. ;echo 注意:1.脚本编码 UTF-8 带签名& echo       2.在输入法英文状态下使用
  6. ;timeout 10
  7. ;exit
  8. f1::send, E:\01_项目2024\15_广西2024\03_资料0914
  9. f2::send, E:\02_项目2024\15_北京2024\03_资料0914
  10. f3::send, E:\03_项目2024\15_西安2024\03_资料0914
  11. return
复制代码

作者: jack2020    时间: 2024-9-18 13:15

回复 26# ppll2030
这个改了英文的可以,但是三个带汉字的地址全部粘贴到了F1里面了   模拟输入需要TAB一下吧

另外一台电脑,不填表,
系统精简过度?vbs脚本就没运行起来吧。需要安装什么VBS包吗还是必须重做系统。

奇怪2台电脑是一个系统镜像,都是安装WIN10专业版,咋底层数据库不同,难道跟主板cpu有关?

作者: jack2020    时间: 2024-9-18 13:18

回复 27# 77七


    谢谢 autohotkey打不开呀
作者: 77七    时间: 2024-9-18 13:26

回复 29# jack2020


   按步骤就行。(这个不用安装。)
作者: ppll2030    时间: 2024-9-18 13:34

回复 28# jack2020


    同样是win10,运行环境差这么大
26楼重新修改了。调整了切换框框的顺序,这次应该没问题吧。
作者: jack2020    时间: 2024-9-18 14:22

回复 30# 77七


    可以用 但是F1-F10键盘失效了  哥咋还原呀  有的时候要用F1-F10键的
作者: jack2020    时间: 2024-9-18 14:28

回复 27# 77七


    用了这个代码  F1-F10被这个路径占了   有时候还是要用F-F10   咋还原成初系统始的呀
作者: 77七    时间: 2024-9-18 14:30

回复 32# jack2020


   桌面右下角找到ahk脚本,退出。
或者,既然都用到autohotkey了,可以自定义热键,避免与已有的冲突。
  1. ::111::E:\01_项目2024\15_广西2024\03_资料0914
  2. ::222::E:\02_项目2024\15_北京2024\03_资料0914
  3. ::333::E:\03_项目2024\15_西安2024\03_资料0914
复制代码


仍然是输入法英文状态下,输入 111按空格,会自动替换。详细可参考 11楼链接。
作者: jack2020    时间: 2024-9-18 14:34

回复 34# 77七


    厉害
作者: jack2020    时间: 2024-9-18 14:51

回复 31# ppll2030


    还是不跳框,都在F1,我用27楼代码可以实现了  还是谢谢大佬的代码呀,可能函数底层不同  不兼容呀
作者: idwma    时间: 2024-9-19 09:47

确实可以用bat替代这个软件,系统自带的命令行power
  1. #@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
  2. $list=@(
  3. 'C:\01_项目AA2'
  4. 'C:\01_项目AA2'
  5. 'C:\01_项目AA2'
  6. )
  7. Add-Type -AssemblyName System.Windows.Forms
  8. Add-Type @'
  9. using System;
  10. using System.Runtime.InteropServices;
  11. public class HK
  12. {
  13.     [DllImport("user32.dll")]
  14.     public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);
  15.     [DllImport("user32.dll")]
  16.     public static extern bool GetMessage(ref MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax);
  17.     [StructLayout(LayoutKind.Sequential)]
  18.     public struct MSG
  19.     {
  20. public IntPtr hwnd;
  21. public uint message;
  22. public IntPtr wParam;
  23. public IntPtr lParam;
  24. public uint time;
  25. public int x;
  26. public int y;
  27.     }
  28. }
  29. '@
  30. $define = for($i=0x70; $i -le 0x79; $i++){
  31. [void][HK]::RegisterHotKey(0, $i, 0x4000, $i)
  32. "{0}{{scb '{1}'; {2}; break}}" -f $i, $list[$i-0x70], '[System.Windows.Forms.SendKeys]::SendWait("^v")'
  33. }
  34. $define='switch($msg.wParam){'+($define|out-string)+'}'
  35. $msg = @{}
  36. while([HK]::GetMessage([ref]$msg, 0, 0, 0) -ne 0){if($msg.message -eq 0x0312){iex $define}}
复制代码

作者: jack2020    时间: 2024-9-19 11:15

回复 37# idwma


    大神    能否写个使用说明  小白表示看不懂
作者: idwma    时间: 2024-9-19 12:56

回复 38# jack2020


    第4行这里按格式修改可以多加几行,保存为bat运行,和这个软件一样按f1-10
作者: Five66    时间: 2024-9-20 17:35

源码是易语言的,没钱用正版,不想用盗版,用C#弄了个差不多的
将下面代码保存为ANSI编码的bat然后运行,运行后会使用系统自带的C#编译器进行编译(有的话)
  1. /*
  2. @echo off&chcp 936&cls&setlocal
  3. set "exename=单功能剪切板.exe"
  4. if exist "%exename%" start "" "%exename%"&exit/b
  5. for /f "delims=" %%a in ('dir /b /ad /o-n "%systemroot%\Microsoft.NET"') do (
  6. for /f "delims=" %%b in ('dir /b /ad /o-n "%systemroot%\Microsoft.NET\%%a"') do (
  7. for /f "delims=" %%r in ('dir /s /b /o-n "%systemroot%\Microsoft.NET\%%a\%%b\csc.exe"') do (
  8. if "%%~xr"==".exe" (
  9. set "csc=%%~fr"
  10. goto :aaa)
  11. )))
  12. echo 找不到C#编译器csc.exe
  13. goto :bbb
  14. :aaa
  15. "%csc%"  /target:winexe /out:"%exename%"  "%~f0"
  16. echo,&timeout /t 1 1>nul
  17. if exist "%exename%" (echo,编译成功,请重新运行此bat或%exename%) else (echo,编译失败)
  18. :bbb
  19. endlocal
  20. echo,&pause&exit /b
  21. */
  22. using System;
  23. using System.Drawing;
  24. using System.Collections.Generic;
  25. using System.IO;
  26. using System.Linq;
  27. using System.Threading.Tasks;
  28. using System.Text;
  29. using System.Windows.Forms;
  30. using System.Runtime.InteropServices;
  31. namespace WinFormsApp
  32. {
  33. public class Winapi{
  34. public const int WM_DESTROY=0x0002;
  35. public const int WM_HOTKEY=0x0312;
  36. public const int MOD_NOREPEAT=0x4000;
  37. [DllImport("user32.dll",ExactSpelling=true)]
  38. [return:MarshalAs(UnmanagedType.Bool)]
  39. public static extern bool RegisterHotKey(IntPtr hwnd,int id,uint fsmodifiers,uint vk);
  40. [DllImport("user32.dll",ExactSpelling=true)]
  41. [return:MarshalAs(UnmanagedType.Bool)]
  42. public static extern bool UnregisterHotKey(IntPtr hwnd,int id);
  43. }
  44. public partial class Form999:Form{
  45. private List<Label> lstlb;
  46. private List<TextBox> lsttb;
  47. private List<bool> lsbl;
  48. private Button bt1;
  49. private Button bt2;
  50. private Label lb;
  51. private System.ComponentModel.IContainer components = null;
  52. protected override void Dispose(bool disposing){
  53. if (disposing && (components != null)){components.Dispose();}
  54. base.Dispose(disposing);
  55. }
  56. public Form999(){Initial();}//this.bt2.PerformClick();}
  57. public void Initial(){
  58. this.lstlb=new List<Label>(10);
  59. this.lsttb=new List<TextBox>(10);
  60. this.lsbl=new List<bool>(10);
  61. for(int t=0x70;t<0x7a;t++){
  62. lsbl.Add(Winapi.RegisterHotKey(this.Handle,t,Winapi.MOD_NOREPEAT,(uint)t));
  63. }
  64. this.SuspendLayout();
  65. int i=0;
  66. for(int c=0;c<10;c++){
  67. lstlb.Add(new Label());
  68. if((c>4) && (0==i)){i+=1;}
  69. lstlb[c].Size=new Size(30,70);
  70. lstlb[c].Name="lable"+c;
  71. if(c<5){lstlb[c].TextAlign=ContentAlignment.TopRight;}
  72. lstlb[c].Text=String.Format("F{0}",c+1);
  73. lstlb[c].Location=new Point(16+(8+150+60+30+8)*i,70*(c%5)+8*(c%5+1));
  74. lsttb.Add(new TextBox());
  75. if((c>4) && (0==i)){i+=1;}
  76. lsttb[c].Size=new Size(150,70);
  77. lsttb[c].Name="textbox"+c;
  78. lsttb[c].TabIndex=i;
  79. lsttb[c].BorderStyle=BorderStyle.FixedSingle;
  80. lsttb[c].Multiline=true;
  81. lsttb[c].Location=new Point(16+30+8+(150+60+30+8)*i,70*(c%5)+8*(c%5+1));
  82. if(!lsbl[c]){lsttb[c].Enabled=false;lsttb[c].Text="快捷键注册失败";}
  83. }
  84. this.bt1=new Button();
  85. this.bt1.Name="button1";
  86. this.bt1.Size=new Size(100,24);
  87. this.bt1.Location=new Point(16+30+8+24,480-16-20-32);
  88. this.bt1.TabIndex=11;
  89. this.bt1.Text="清空框框内容";
  90. this.bt1.UseVisualStyleBackColor=true;
  91. this.bt1.Click+=new EventHandler(this.bt1_Click);
  92. this.bt2=new Button();
  93. this.bt2.Name="button2";
  94. this.bt2.Size=new Size(100,24);
  95. this.bt2.Location=new Point(16+(30+8)*2+150+60+24,480-16-20-32);
  96. this.bt2.TabIndex=12;
  97. this.bt2.Text="重新加载配置";
  98. this.bt2.UseVisualStyleBackColor=true;
  99. this.bt2.Click+=new EventHandler(this.bt2_Click);
  100. for(int t=0;t<10;t++){this.lstlb[t].TabIndex=t+13;}
  101. this.lb=new Label();
  102. this.lb.Location = new System.Drawing.Point(8, 480-16-8);
  103. this.lb.Name = "label";
  104. this.lb.Size = new System.Drawing.Size(480-8-8, 20);
  105. this.lb.TabIndex = 23;
  106. this.lb.TextAlign=ContentAlignment.TopCenter;
  107. this.lb.Text="可将 123456.txt 作为配置文件,文件编码 utf8,一行一个,不想配置的可用空行代替";
  108. this.bt2_Click(null,null);
  109. this.ClientSize = new System.Drawing.Size(480, 480);
  110. for(int t=0;t<10;t++){
  111. this.Controls.Add(this.lstlb[t]);
  112. this.Controls.Add(this.lsttb[t]);
  113. }
  114. this.Controls.Add(this.bt1);
  115. this.Controls.Add(this.bt2);
  116. this.Controls.Add(this.lb);
  117. this.Name = "Form999";
  118. this.Text = "单功能剪切版";
  119. this.ResumeLayout(false);
  120. this.PerformLayout();
  121. }
  122. protected override void WndProc(ref Message m)
  123. {
  124. int value=0;
  125. switch(m.Msg){
  126. case Winapi.WM_DESTROY:
  127. for(int t=0;t<10;t++){
  128. if(this.lsbl[t]){
  129. Winapi.UnregisterHotKey(this.Handle,t+0x70);
  130. }}
  131. break;
  132. case Winapi.WM_HOTKEY:
  133. value=(int)m.WParam;
  134. if((value>0x69)&&(value<0x7a)){
  135. Clipboard.SetData("UnicodeText",this.lsttb[value-0x70].Text);
  136. System.Threading.Thread.Sleep(0);
  137. SendKeys.SendWait("^v");
  138. }
  139. break;
  140. }
  141. base.WndProc(ref m);
  142. }
  143. private void bt1_Click(object sender, EventArgs e){
  144. for(int t=0;t<10;t++){
  145. if(lsbl[t]){this.lsttb[t].Text="";}
  146. }}
  147. private void bt2_Click(object sender, EventArgs e){
  148. string cfgfile="123456.txt";
  149. string[] str;
  150. if(File.Exists(cfgfile)){
  151. str=File.ReadAllLines(cfgfile,Encoding.UTF8);
  152. for(int t=0;(t<(str.Length-1))&&(t<10);t++){
  153. if(this.lsbl[t]){this.lsttb[t].Text=str[t];}
  154. }}}
  155. }
  156. static class Program{
  157. [STAThread]
  158. static void Main(){
  159. Application.EnableVisualStyles();
  160. Application.SetCompatibleTextRenderingDefault(false);
  161. Application.Run(new Form999());
  162. }}
  163. }
复制代码

作者: ygqiang    时间: 2024-9-20 20:10

回复 40# Five66


win11x64系统下,测试成功。

代码能否修改下?实现:智能判断如果当前f1-f10框里面是空的内容,就还是用系统自带的按键功能。
比如运行单功能剪切板.exe软件里f2对应的内容是空的,鼠标点击某个文件名,再按f2按键就是修改文件名状态。
作者: Five66    时间: 2024-9-21 13:01

回复 41# ygqiang


   
试试删掉原来的,换成下面的,然后重新运行编译
因为不是通过取消快捷键来恢复的,不一定常常有效
  1. /*
  2. @echo off&chcp 936&cls&setlocal
  3. set "exename=单功能剪切板.exe"
  4. if exist "%exename%" start "" "%exename%"&endlocal&exit/b
  5. for /f "delims=" %%a in ('dir /b /ad /o-n "%systemroot%\Microsoft.NET"') do (
  6. for /f "delims=" %%b in ('dir /b /ad /o-n "%systemroot%\Microsoft.NET\%%a"') do (
  7. for /f "delims=" %%r in ('dir /s /b /o-n "%systemroot%\Microsoft.NET\%%a\%%b\csc.exe"') do (
  8. if "%%~xr"==".exe" (
  9. set "csc=%%~fr"
  10. goto :aaa)
  11. )))
  12. echo 找不到C#编译器csc.exe
  13. goto :bbb
  14. :aaa
  15. "%csc%"  /target:winexe /out:"%exename%"  "%~f0"
  16. echo,&timeout /t 1 1>nul
  17. if exist "%exename%" (echo,编译成功,请重新运行此bat或%exename%) else (echo,编译失败)
  18. :bbb
  19. endlocal
  20. echo,&pause&exit /b
  21. */
  22. using System;
  23. using System.Drawing;
  24. using System.Collections.Generic;
  25. using System.IO;
  26. using System.Linq;
  27. using System.Threading.Tasks;
  28. using System.Text;
  29. using System.Windows.Forms;
  30. using System.Runtime.InteropServices;
  31. namespace WinFormsApp
  32. {
  33. public class Winapi{
  34. public const int WM_DESTROY=0x0002;
  35. public const int WM_HOTKEY=0x0312;
  36. public const int WM_KEYDOWN=0x0100;
  37. public const int WM_KEYUP=0x0101;//public const int WM_CHAR=0x0102;
  38. public const int MOD_NOREPEAT=0x4000;
  39. [DllImport("user32.dll",ExactSpelling=true)]
  40. [return:MarshalAs(UnmanagedType.Bool)]
  41. public static extern bool RegisterHotKey(IntPtr hwnd,int id,uint fsmodifiers,uint vk);
  42. [DllImport("user32.dll",ExactSpelling=true)]
  43. [return:MarshalAs(UnmanagedType.Bool)]
  44. public static extern bool UnregisterHotKey(IntPtr hwnd,int id);
  45. [DllImport("user32.dll")]
  46. public static extern IntPtr GetForegroundWindow();
  47. [DllImport("user32.dll",ExactSpelling=true)]
  48. [return:MarshalAs(UnmanagedType.Bool)]
  49. public static extern bool PostMessageA(IntPtr hwnd, uint msg, int wparam, uint iparam);
  50. }
  51. public partial class Form999:Form{
  52. private List<Label> lstlb;
  53. private List<TextBox> lsttb;
  54. private List<bool> lsbl;
  55. private Button bt1;
  56. private Button bt2;
  57. private Label lb;
  58. private System.ComponentModel.IContainer components = null;
  59. protected override void Dispose(bool disposing){
  60. if (disposing && (components != null)){components.Dispose();}
  61. base.Dispose(disposing);
  62. }
  63. public Form999(){Initial();}//this.bt2.PerformClick();}
  64. public void Initial(){
  65. this.lstlb=new List<Label>(10);
  66. this.lsttb=new List<TextBox>(10);
  67. this.lsbl=new List<bool>(10);
  68. for(int t=0x70;t<0x7a;t++){
  69. lsbl.Add(Winapi.RegisterHotKey(this.Handle,t,Winapi.MOD_NOREPEAT,(uint)t));
  70. }
  71. this.SuspendLayout();
  72. int i=0;
  73. for(int c=0;c<10;c++){
  74. lstlb.Add(new Label());
  75. if((c>4) && (0==i)){i+=1;}
  76. lstlb[c].Size=new Size(30,70);
  77. lstlb[c].Name="lable"+c;
  78. if(c<5){lstlb[c].TextAlign=ContentAlignment.TopRight;}
  79. lstlb[c].Text=String.Format("F{0}",c+1);
  80. lstlb[c].Location=new Point(16+(8+150+60+30+8)*i,70*(c%5)+8*(c%5+1));
  81. lsttb.Add(new TextBox());
  82. if((c>4) && (0==i)){i+=1;}
  83. lsttb[c].Size=new Size(150,70);
  84. lsttb[c].Name="textbox"+c;
  85. lsttb[c].TabIndex=i;
  86. lsttb[c].BorderStyle=BorderStyle.FixedSingle;
  87. lsttb[c].Multiline=true;
  88. lsttb[c].Location=new Point(16+30+8+(150+60+30+8)*i,70*(c%5)+8*(c%5+1));
  89. if(!lsbl[c]){lsttb[c].Enabled=false;lsttb[c].Text="快捷键注册失败";}
  90. }
  91. this.bt1=new Button();
  92. this.bt1.Name="button1";
  93. this.bt1.Size=new Size(100,24);
  94. this.bt1.Location=new Point(16+30+8+24,480-16-20-32);
  95. this.bt1.TabIndex=11;
  96. this.bt1.Text="清空框框内容";
  97. this.bt1.UseVisualStyleBackColor=true;
  98. this.bt1.Click+=new EventHandler(this.bt1_Click);
  99. this.bt2=new Button();
  100. this.bt2.Name="button2";
  101. this.bt2.Size=new Size(100,24);
  102. this.bt2.Location=new Point(16+(30+8)*2+150+60+24,480-16-20-32);
  103. this.bt2.TabIndex=12;
  104. this.bt2.Text="重新加载配置";
  105. this.bt2.UseVisualStyleBackColor=true;
  106. this.bt2.Click+=new EventHandler(this.bt2_Click);
  107. for(int t=0;t<10;t++){this.lstlb[t].TabIndex=t+13;}
  108. this.lb=new Label();
  109. this.lb.Location = new System.Drawing.Point(8, 480-16-8);
  110. this.lb.Name = "label";
  111. this.lb.Size = new System.Drawing.Size(480-8-8, 20);
  112. this.lb.TabIndex = 23;
  113. this.lb.TextAlign=ContentAlignment.TopCenter;
  114. this.lb.Text="可将 123456.txt 作为配置文件,文件编码 utf8,一行一个,不想配置的可用空行代替";
  115. this.bt2_Click(null,null);
  116. this.ClientSize = new System.Drawing.Size(480, 480);
  117. for(int t=0;t<10;t++){
  118. this.Controls.Add(this.lstlb[t]);
  119. this.Controls.Add(this.lsttb[t]);
  120. }
  121. this.Controls.Add(this.bt1);
  122. this.Controls.Add(this.bt2);
  123. this.Controls.Add(this.lb);
  124. this.Name = "Form999";
  125. this.Text = "单功能剪切板";
  126. this.ResumeLayout(false);
  127. this.PerformLayout();
  128. }
  129. protected override void WndProc(ref Message m)
  130. {
  131. int value=0;IntPtr ip;
  132. switch(m.Msg){
  133. case Winapi.WM_DESTROY:
  134. for(int t=0;t<10;t++){
  135. if(this.lsbl[t]){
  136. Winapi.UnregisterHotKey(this.Handle,t+0x70);
  137. }}
  138. break;
  139. case Winapi.WM_HOTKEY:
  140. value=(int)m.WParam;
  141. if((value>0x69)&&(value<0x7a)&&(!string.IsNullOrEmpty(this.lsttb[value-0x70].Text))){
  142. Clipboard.SetData("UnicodeText",this.lsttb[value-0x70].Text);
  143. System.Threading.Thread.Sleep(0);
  144. SendKeys.SendWait("^v");
  145. }else{
  146. ip=Winapi.GetForegroundWindow();
  147. if(ip != IntPtr.Zero){
  148. Winapi.PostMessageA(ip,Winapi.WM_KEYDOWN,value,0x40000001);
  149. Winapi.PostMessageA(ip,Winapi.WM_KEYUP,value,0xc0000001);
  150. }}
  151. break;
  152. }
  153. base.WndProc(ref m);
  154. }
  155. private void bt1_Click(object sender, EventArgs e){
  156. for(int t=0;t<10;t++){
  157. if(lsbl[t]){this.lsttb[t].Text="";}
  158. }}
  159. private void bt2_Click(object sender, EventArgs e){
  160. string cfgfile="123456.txt";
  161. string[] str;
  162. if(File.Exists(cfgfile)){
  163. str=File.ReadAllLines(cfgfile,Encoding.UTF8);
  164. for(int t=0;(t<(str.Length-1))&&(t<10);t++){
  165. if(this.lsbl[t]){this.lsttb[t].Text=str[t];}
  166. }}}
  167. }
  168. static class Program{
  169. [STAThread]
  170. static void Main(){
  171. Application.EnableVisualStyles();
  172. Application.SetCompatibleTextRenderingDefault(false);
  173. Application.Run(new Form999());
  174. }}
  175. }
复制代码

作者: ygqiang    时间: 2024-9-21 13:23

回复 42# Five66


谢谢。运行单功能剪切板.exe,f1按键绑定f1sdffds,f2按键空的,f3按键绑定f3df343,其他按键都是空的。
f1和f3按键功能正常,f2按键可以实现文件名重命名的功能。但是:新建一个txt文件并打开,f5按键没反应

如果单功能剪切板.exe退出,新建一个txt文件并打开,f5按键是添加时间日期功能。

这是什么原因?
作者: Five66    时间: 2024-9-21 14:12

回复 43# ygqiang


   
通过向前台主窗口发送消息来实现的(不然的话快捷键要不断一关一开,很容易出问题),有些窗口关系复杂的可能无效
而且uwp应用有winrt(windows runtime),某些情况下也可能无效
总之就是不一定有效




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2