标题: [文件操作] 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,跟程序放一块运行即可。- set ws = createobject("wscript.shell")
- ws.run ("多功能剪切板.exe")
- wscript.sleep 1000
- ws.appactivate("多功能剪切板")
- ws.sendkeys "c:\11" 'F1的快捷路径
- ws.sendkeys "~{TAB}"
- ws.sendkeys "c:\22" 'F2的快捷路径
- ws.sendkeys "~{TAB}"
- ws.sendkeys "c:\33"
- ws.sendkeys "~{TAB}"
- wscript.sleep 1000
- ws.sendkeys "% n" '输入完成,最小化多功能窗口
- 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的数值一定要与地址列表行号对应。- @echo off&setlocal enabledelayedexpansion
- (echo set ws = createobject("wscript.shell"^)
- echo N = WScript.Arguments(0^)
- echo ws.appactivate("多功能剪切板"^)
- echo wscript.sleep 500
- echo For i = 1 To N-1
- echo ws.SendKeys "{TAB}"
- echo Next
- echo ws.sendkeys "^v"
- echo wscript.sleep 500
- echo ws.sendkeys "{TAB}"
- echo wscript.quit)>$.vbs
-
- start "" "多功能剪切板.exe"
- rem 注意 +21 这个数值与下面的 “地址列表:”的行数一致。否则取数会出错
- for /f "delims=" %%i in ('more +21 %~f0') do (
- set/a n+=1&echo %%i | clip &cscript //NoLogo $.vbs !n!
- )
- del $.vbs&exit/b
-
- 地址列表:
- E:\01_项目2024\15_广西2024\03_资料0914
- E:\02_项目2024\15_北京2024\03_资料0914
- E:\03_项目2024\15_西安2024\03_资料0914
复制代码
作者: jack2020 时间: 2024-9-14 15:42
回复 6# czjt1234
是后面一种
作者: flashercs 时间: 2024-9-14 15:45
保存为1.bat, ANSI编码.- <#*,:
- @echo off
- cd /d "%~dp0"
- set "batchfile=%~f0"
- Powershell -ExecutionPolicy Bypass -C "Set-Location -LiteralPath ([Environment]::CurrentDirectory);. ([ScriptBlock]::Create([IO.File]::ReadAllText($env:batchfile,[Text.Encoding]::GetEncoding(0) )) )"
-
- exit /b
- #>
- Add-Type -AssemblyName System.Windows.Forms, Microsoft.VisualBasic
- $proc = Start-Process -FilePath "多功能剪切板.exe" -PassThru
- [Microsoft.VisualBasic.Interaction]::AppActivate($proc.Id)
- # Start-Sleep -Milliseconds 1000
- [System.Windows.Forms.SendKeys]::SendWait("E:\01_项目2024\15_广西2024\03_资料0914") # F1的快捷路径
- [System.Windows.Forms.SendKeys]::SendWait("~{TAB}")
-
- [System.Windows.Forms.SendKeys]::SendWait("E:\22\01_项目2024\15_广西2024\03_资料0914") # F2的快捷路径
- [System.Windows.Forms.SendKeys]::SendWait("~{TAB}")
-
- [System.Windows.Forms.SendKeys]::SendWait("E:\33\中文abc") # F3的快捷路径
- [System.Windows.Forms.SendKeys]::SendWait("~{TAB}")
-
- Start-Sleep -Milliseconds 500
- [System.Windows.Forms.SendKeys]::SendWait("% n")
复制代码
作者: jack2020 时间: 2024-9-14 15:54
回复 9# flashercs
好像无法启动
多功能剪切板.exe
作者: 77七 时间: 2024-9-14 15:54
放弃小工具,直接用autohotkey可能比较简单 试着写了一个
- f1::send, E:\01_项目2024\15_广西2024\03_资料0914
- f2::send, E:\02_项目2024\15_北京2024\03_资料0914
- f3::send, E:\03_项目2024\15_西安2024\03_资料0914
- 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 测试通过- @echo off
-
- :loop
- set /p s=请输入一个数字,按回车键退出
- if %s%==1 goto :c1
- if %s%==2 goto :c2
- exit
-
- :c1
- set "s=E:\01_项目2024\15_广西2024\03_资料0914"
- mshta.exe vbscript:ClipboardData.SetData("text","%s%")(close)
- echo 已复制 %s%
- echo,
- goto :loop
-
- :c2
- set "s=E:\01_项目2024\"
- mshta.exe vbscript:ClipboardData.SetData("text","%s%")(close)
- echo 已复制 %s%
- echo,
- 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了。
脚本在定义路径后,可以自动最小化程序,默认没开启,需要的自己改一下,去掉::就可以了。- @echo off&setlocal enabledelayedexpansion
- (echo set ws = createobject("wscript.shell"^)
- echo N = WScript.Arguments(0^)
- echo ws.appactivate("多功能剪切板"^)
- echo wscript.sleep 500
- echo For i = 1 To N-1
- echo ws.SendKeys "{TAB}"
- echo Next
- echo ws.sendkeys "^v"
- echo wscript.sleep 500
- echo ws.sendkeys "{TAB}"
- echo wscript.quit)>$.vbs
-
- start "" "多功能剪切板.exe"
- for /f "delims=" %%i in (地址列表.txt) do (
- set/a n+=1&echo %%i | clip &cscript //NoLogo $.vbs !n!
- )
- rem 地址粘贴完成,把软件最小化,需要的可以把::去掉
- ::mshta vbscript:execute("Set A=CreateObject(""WScript.Shell""):a.appactivate""多功能剪切板"":A.sendkeys(""%% n""):close")
- 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也不用改编码,就用默认的。- @echo off&setlocal enabledelayedexpansion
- chcp 936
- (echo set ws = createobject("wscript.shell"^)
- echo N = WScript.Arguments(0^)
- echo ws.appactivate("多功能剪切板"^)
- echo wscript.sleep 500
- echo For i = 1 To N-1
- echo ws.SendKeys "{TAB}"
- echo Next
- echo ws.sendkeys "^v"
- echo wscript.sleep 500
- echo wscript.quit)>$.vbs
-
- chcp 65001
- start "" "MultiClipBoard.exe"
- for /f "delims=" %%i in (addlist.txt) do (
- set/a n+=1&echo %%i | clip &cscript //NoLogo $.vbs !n!
- )
- rem 地址粘贴完成,把软件最小化,需要的可以把::去掉
- ::mshta vbscript:execute("Set A=CreateObject(""WScript.Shell""):a.appactivate""多功能剪切板"":A.sendkeys(""%% n""):close")
- 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
- ;&cls &@echo off
- ;chcp 65001 >nul
- ;cd /d "%~dp0"
- ;start "" "AutoHotkey.exe" "%~f0"
- ;echo 注意:1.脚本编码 UTF-8 带签名& echo 2.在输入法英文状态下使用
- ;timeout 10
- ;exit
-
- f1::send, E:\01_项目2024\15_广西2024\03_资料0914
- f2::send, E:\02_项目2024\15_北京2024\03_资料0914
- f3::send, E:\03_项目2024\15_西安2024\03_资料0914
- 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了,可以自定义热键,避免与已有的冲突。
- ::111::E:\01_项目2024\15_广西2024\03_资料0914
- ::222::E:\02_项目2024\15_北京2024\03_资料0914
- ::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- #@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
-
- $list=@(
- 'C:\01_项目AA2'
- 'C:\01_项目AA2'
- 'C:\01_项目AA2'
- )
-
- Add-Type -AssemblyName System.Windows.Forms
- Add-Type @'
- using System;
- using System.Runtime.InteropServices;
-
- public class HK
- {
- [DllImport("user32.dll")]
- public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);
- [DllImport("user32.dll")]
- public static extern bool GetMessage(ref MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax);
- [StructLayout(LayoutKind.Sequential)]
- public struct MSG
- {
- public IntPtr hwnd;
- public uint message;
- public IntPtr wParam;
- public IntPtr lParam;
- public uint time;
- public int x;
- public int y;
- }
- }
- '@
-
- $define = for($i=0x70; $i -le 0x79; $i++){
- [void][HK]::RegisterHotKey(0, $i, 0x4000, $i)
- "{0}{{scb '{1}'; {2}; break}}" -f $i, $list[$i-0x70], '[System.Windows.Forms.SendKeys]::SendWait("^v")'
- }
- $define='switch($msg.wParam){'+($define|out-string)+'}'
-
- $msg = @{}
- 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#编译器进行编译(有的话)- /*
- @echo off&chcp 936&cls&setlocal
- set "exename=单功能剪切板.exe"
- if exist "%exename%" start "" "%exename%"&exit/b
- for /f "delims=" %%a in ('dir /b /ad /o-n "%systemroot%\Microsoft.NET"') do (
- for /f "delims=" %%b in ('dir /b /ad /o-n "%systemroot%\Microsoft.NET\%%a"') do (
- for /f "delims=" %%r in ('dir /s /b /o-n "%systemroot%\Microsoft.NET\%%a\%%b\csc.exe"') do (
- if "%%~xr"==".exe" (
- set "csc=%%~fr"
- goto :aaa)
- )))
- echo 找不到C#编译器csc.exe
- goto :bbb
- :aaa
- "%csc%" /target:winexe /out:"%exename%" "%~f0"
- echo,&timeout /t 1 1>nul
- if exist "%exename%" (echo,编译成功,请重新运行此bat或%exename%) else (echo,编译失败)
- :bbb
- endlocal
- echo,&pause&exit /b
- */
-
- using System;
- using System.Drawing;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Threading.Tasks;
- using System.Text;
- using System.Windows.Forms;
- using System.Runtime.InteropServices;
-
- namespace WinFormsApp
- {
- public class Winapi{
- public const int WM_DESTROY=0x0002;
- public const int WM_HOTKEY=0x0312;
- public const int MOD_NOREPEAT=0x4000;
- [DllImport("user32.dll",ExactSpelling=true)]
- [return:MarshalAs(UnmanagedType.Bool)]
- public static extern bool RegisterHotKey(IntPtr hwnd,int id,uint fsmodifiers,uint vk);
- [DllImport("user32.dll",ExactSpelling=true)]
- [return:MarshalAs(UnmanagedType.Bool)]
- public static extern bool UnregisterHotKey(IntPtr hwnd,int id);
- }
-
- public partial class Form999:Form{
-
- private List<Label> lstlb;
- private List<TextBox> lsttb;
- private List<bool> lsbl;
- private Button bt1;
- private Button bt2;
- private Label lb;
- private System.ComponentModel.IContainer components = null;
-
- protected override void Dispose(bool disposing){
- if (disposing && (components != null)){components.Dispose();}
- base.Dispose(disposing);
- }
-
- public Form999(){Initial();}//this.bt2.PerformClick();}
-
- public void Initial(){
- this.lstlb=new List<Label>(10);
- this.lsttb=new List<TextBox>(10);
- this.lsbl=new List<bool>(10);
- for(int t=0x70;t<0x7a;t++){
- lsbl.Add(Winapi.RegisterHotKey(this.Handle,t,Winapi.MOD_NOREPEAT,(uint)t));
- }
- this.SuspendLayout();
- int i=0;
- for(int c=0;c<10;c++){
- lstlb.Add(new Label());
- if((c>4) && (0==i)){i+=1;}
- lstlb[c].Size=new Size(30,70);
- lstlb[c].Name="lable"+c;
- if(c<5){lstlb[c].TextAlign=ContentAlignment.TopRight;}
- lstlb[c].Text=String.Format("F{0}",c+1);
- lstlb[c].Location=new Point(16+(8+150+60+30+8)*i,70*(c%5)+8*(c%5+1));
-
- lsttb.Add(new TextBox());
- if((c>4) && (0==i)){i+=1;}
- lsttb[c].Size=new Size(150,70);
- lsttb[c].Name="textbox"+c;
- lsttb[c].TabIndex=i;
- lsttb[c].BorderStyle=BorderStyle.FixedSingle;
- lsttb[c].Multiline=true;
- lsttb[c].Location=new Point(16+30+8+(150+60+30+8)*i,70*(c%5)+8*(c%5+1));
- if(!lsbl[c]){lsttb[c].Enabled=false;lsttb[c].Text="快捷键注册失败";}
- }
-
- this.bt1=new Button();
- this.bt1.Name="button1";
- this.bt1.Size=new Size(100,24);
- this.bt1.Location=new Point(16+30+8+24,480-16-20-32);
- this.bt1.TabIndex=11;
- this.bt1.Text="清空框框内容";
- this.bt1.UseVisualStyleBackColor=true;
- this.bt1.Click+=new EventHandler(this.bt1_Click);
-
- this.bt2=new Button();
- this.bt2.Name="button2";
- this.bt2.Size=new Size(100,24);
- this.bt2.Location=new Point(16+(30+8)*2+150+60+24,480-16-20-32);
- this.bt2.TabIndex=12;
- this.bt2.Text="重新加载配置";
- this.bt2.UseVisualStyleBackColor=true;
- this.bt2.Click+=new EventHandler(this.bt2_Click);
-
- for(int t=0;t<10;t++){this.lstlb[t].TabIndex=t+13;}
-
- this.lb=new Label();
- this.lb.Location = new System.Drawing.Point(8, 480-16-8);
- this.lb.Name = "label";
- this.lb.Size = new System.Drawing.Size(480-8-8, 20);
- this.lb.TabIndex = 23;
- this.lb.TextAlign=ContentAlignment.TopCenter;
- this.lb.Text="可将 123456.txt 作为配置文件,文件编码 utf8,一行一个,不想配置的可用空行代替";
-
- this.bt2_Click(null,null);
- this.ClientSize = new System.Drawing.Size(480, 480);
- for(int t=0;t<10;t++){
- this.Controls.Add(this.lstlb[t]);
- this.Controls.Add(this.lsttb[t]);
- }
- this.Controls.Add(this.bt1);
- this.Controls.Add(this.bt2);
- this.Controls.Add(this.lb);
- this.Name = "Form999";
- this.Text = "单功能剪切版";
- this.ResumeLayout(false);
- this.PerformLayout();
- }
- protected override void WndProc(ref Message m)
- {
- int value=0;
- switch(m.Msg){
- case Winapi.WM_DESTROY:
- for(int t=0;t<10;t++){
- if(this.lsbl[t]){
- Winapi.UnregisterHotKey(this.Handle,t+0x70);
- }}
- break;
- case Winapi.WM_HOTKEY:
- value=(int)m.WParam;
- if((value>0x69)&&(value<0x7a)){
- Clipboard.SetData("UnicodeText",this.lsttb[value-0x70].Text);
- System.Threading.Thread.Sleep(0);
- SendKeys.SendWait("^v");
- }
- break;
- }
- base.WndProc(ref m);
- }
-
- private void bt1_Click(object sender, EventArgs e){
- for(int t=0;t<10;t++){
- if(lsbl[t]){this.lsttb[t].Text="";}
- }}
-
- private void bt2_Click(object sender, EventArgs e){
- string cfgfile="123456.txt";
- string[] str;
- if(File.Exists(cfgfile)){
- str=File.ReadAllLines(cfgfile,Encoding.UTF8);
- for(int t=0;(t<(str.Length-1))&&(t<10);t++){
- if(this.lsbl[t]){this.lsttb[t].Text=str[t];}
- }}}
- }
- static class Program{
- [STAThread]
- static void Main(){
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- Application.Run(new Form999());
- }}
-
- }
复制代码
作者: ygqiang 时间: 2024-9-20 20:10
回复 40# Five66
win11x64系统下,测试成功。
代码能否修改下?实现:智能判断如果当前f1-f10框里面是空的内容,就还是用系统自带的按键功能。
比如运行单功能剪切板.exe软件里f2对应的内容是空的,鼠标点击某个文件名,再按f2按键就是修改文件名状态。
作者: Five66 时间: 2024-9-21 13:01
回复 41# ygqiang
试试删掉原来的,换成下面的,然后重新运行编译
因为不是通过取消快捷键来恢复的,不一定常常有效- /*
- @echo off&chcp 936&cls&setlocal
- set "exename=单功能剪切板.exe"
- if exist "%exename%" start "" "%exename%"&endlocal&exit/b
- for /f "delims=" %%a in ('dir /b /ad /o-n "%systemroot%\Microsoft.NET"') do (
- for /f "delims=" %%b in ('dir /b /ad /o-n "%systemroot%\Microsoft.NET\%%a"') do (
- for /f "delims=" %%r in ('dir /s /b /o-n "%systemroot%\Microsoft.NET\%%a\%%b\csc.exe"') do (
- if "%%~xr"==".exe" (
- set "csc=%%~fr"
- goto :aaa)
- )))
- echo 找不到C#编译器csc.exe
- goto :bbb
- :aaa
- "%csc%" /target:winexe /out:"%exename%" "%~f0"
- echo,&timeout /t 1 1>nul
- if exist "%exename%" (echo,编译成功,请重新运行此bat或%exename%) else (echo,编译失败)
- :bbb
- endlocal
- echo,&pause&exit /b
- */
-
- using System;
- using System.Drawing;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Threading.Tasks;
- using System.Text;
- using System.Windows.Forms;
- using System.Runtime.InteropServices;
-
- namespace WinFormsApp
- {
- public class Winapi{
- public const int WM_DESTROY=0x0002;
- public const int WM_HOTKEY=0x0312;
- public const int WM_KEYDOWN=0x0100;
- public const int WM_KEYUP=0x0101;//public const int WM_CHAR=0x0102;
- public const int MOD_NOREPEAT=0x4000;
- [DllImport("user32.dll",ExactSpelling=true)]
- [return:MarshalAs(UnmanagedType.Bool)]
- public static extern bool RegisterHotKey(IntPtr hwnd,int id,uint fsmodifiers,uint vk);
- [DllImport("user32.dll",ExactSpelling=true)]
- [return:MarshalAs(UnmanagedType.Bool)]
- public static extern bool UnregisterHotKey(IntPtr hwnd,int id);
- [DllImport("user32.dll")]
- public static extern IntPtr GetForegroundWindow();
- [DllImport("user32.dll",ExactSpelling=true)]
- [return:MarshalAs(UnmanagedType.Bool)]
- public static extern bool PostMessageA(IntPtr hwnd, uint msg, int wparam, uint iparam);
- }
-
- public partial class Form999:Form{
-
- private List<Label> lstlb;
- private List<TextBox> lsttb;
- private List<bool> lsbl;
- private Button bt1;
- private Button bt2;
- private Label lb;
- private System.ComponentModel.IContainer components = null;
-
- protected override void Dispose(bool disposing){
- if (disposing && (components != null)){components.Dispose();}
- base.Dispose(disposing);
- }
-
- public Form999(){Initial();}//this.bt2.PerformClick();}
-
- public void Initial(){
- this.lstlb=new List<Label>(10);
- this.lsttb=new List<TextBox>(10);
- this.lsbl=new List<bool>(10);
- for(int t=0x70;t<0x7a;t++){
- lsbl.Add(Winapi.RegisterHotKey(this.Handle,t,Winapi.MOD_NOREPEAT,(uint)t));
- }
- this.SuspendLayout();
- int i=0;
- for(int c=0;c<10;c++){
- lstlb.Add(new Label());
- if((c>4) && (0==i)){i+=1;}
- lstlb[c].Size=new Size(30,70);
- lstlb[c].Name="lable"+c;
- if(c<5){lstlb[c].TextAlign=ContentAlignment.TopRight;}
- lstlb[c].Text=String.Format("F{0}",c+1);
- lstlb[c].Location=new Point(16+(8+150+60+30+8)*i,70*(c%5)+8*(c%5+1));
-
- lsttb.Add(new TextBox());
- if((c>4) && (0==i)){i+=1;}
- lsttb[c].Size=new Size(150,70);
- lsttb[c].Name="textbox"+c;
- lsttb[c].TabIndex=i;
- lsttb[c].BorderStyle=BorderStyle.FixedSingle;
- lsttb[c].Multiline=true;
- lsttb[c].Location=new Point(16+30+8+(150+60+30+8)*i,70*(c%5)+8*(c%5+1));
- if(!lsbl[c]){lsttb[c].Enabled=false;lsttb[c].Text="快捷键注册失败";}
- }
-
- this.bt1=new Button();
- this.bt1.Name="button1";
- this.bt1.Size=new Size(100,24);
- this.bt1.Location=new Point(16+30+8+24,480-16-20-32);
- this.bt1.TabIndex=11;
- this.bt1.Text="清空框框内容";
- this.bt1.UseVisualStyleBackColor=true;
- this.bt1.Click+=new EventHandler(this.bt1_Click);
-
- this.bt2=new Button();
- this.bt2.Name="button2";
- this.bt2.Size=new Size(100,24);
- this.bt2.Location=new Point(16+(30+8)*2+150+60+24,480-16-20-32);
- this.bt2.TabIndex=12;
- this.bt2.Text="重新加载配置";
- this.bt2.UseVisualStyleBackColor=true;
- this.bt2.Click+=new EventHandler(this.bt2_Click);
-
- for(int t=0;t<10;t++){this.lstlb[t].TabIndex=t+13;}
-
- this.lb=new Label();
- this.lb.Location = new System.Drawing.Point(8, 480-16-8);
- this.lb.Name = "label";
- this.lb.Size = new System.Drawing.Size(480-8-8, 20);
- this.lb.TabIndex = 23;
- this.lb.TextAlign=ContentAlignment.TopCenter;
- this.lb.Text="可将 123456.txt 作为配置文件,文件编码 utf8,一行一个,不想配置的可用空行代替";
-
- this.bt2_Click(null,null);
- this.ClientSize = new System.Drawing.Size(480, 480);
- for(int t=0;t<10;t++){
- this.Controls.Add(this.lstlb[t]);
- this.Controls.Add(this.lsttb[t]);
- }
- this.Controls.Add(this.bt1);
- this.Controls.Add(this.bt2);
- this.Controls.Add(this.lb);
- this.Name = "Form999";
- this.Text = "单功能剪切板";
- this.ResumeLayout(false);
- this.PerformLayout();
- }
-
- protected override void WndProc(ref Message m)
- {
- int value=0;IntPtr ip;
- switch(m.Msg){
- case Winapi.WM_DESTROY:
- for(int t=0;t<10;t++){
- if(this.lsbl[t]){
- Winapi.UnregisterHotKey(this.Handle,t+0x70);
- }}
- break;
- case Winapi.WM_HOTKEY:
- value=(int)m.WParam;
- if((value>0x69)&&(value<0x7a)&&(!string.IsNullOrEmpty(this.lsttb[value-0x70].Text))){
- Clipboard.SetData("UnicodeText",this.lsttb[value-0x70].Text);
- System.Threading.Thread.Sleep(0);
- SendKeys.SendWait("^v");
- }else{
- ip=Winapi.GetForegroundWindow();
- if(ip != IntPtr.Zero){
- Winapi.PostMessageA(ip,Winapi.WM_KEYDOWN,value,0x40000001);
- Winapi.PostMessageA(ip,Winapi.WM_KEYUP,value,0xc0000001);
- }}
- break;
- }
- base.WndProc(ref m);
- }
-
- private void bt1_Click(object sender, EventArgs e){
- for(int t=0;t<10;t++){
- if(lsbl[t]){this.lsttb[t].Text="";}
- }}
-
- private void bt2_Click(object sender, EventArgs e){
- string cfgfile="123456.txt";
- string[] str;
- if(File.Exists(cfgfile)){
- str=File.ReadAllLines(cfgfile,Encoding.UTF8);
- for(int t=0;(t<(str.Length-1))&&(t<10);t++){
- if(this.lsbl[t]){this.lsttb[t].Text=str[t];}
- }}}
- }
-
- static class Program{
- [STAThread]
- static void Main(){
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- Application.Run(new Form999());
- }}
-
- }
复制代码
作者: 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 |