<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Windows on LeafCxy's Blog</title><link>https://leafcxy.github.io/tags/windows/</link><description>Recent content in Windows on LeafCxy's Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 28 Jul 2025 00:46:33 +0000</lastBuildDate><atom:link href="https://leafcxy.github.io/tags/windows/index.xml" rel="self" type="application/rss+xml"/><item><title>文件的大小和文件的磁盘大小的区别</title><link>https://leafcxy.github.io/posts/2025-07-28-5/</link><pubDate>Mon, 28 Jul 2025 00:46:33 +0000</pubDate><guid>https://leafcxy.github.io/posts/2025-07-28-5/</guid><description>&lt;p&gt;windows中文件的大小和文件的磁盘大小的区别是？&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;在Windows中，文件的大小和文件的磁盘大小是不同的。&lt;/p&gt;
&lt;p&gt;文件的大小指的是文件中实际存储的数据的大小，通常以字节（bytes）为单位表示。
这个大小是由文件的内容决定的，不受文件所在的磁盘格式和簇大小的影响。&lt;/p&gt;
&lt;p&gt;而文件的磁盘大小（也称为簇大小）指的是文件在磁盘上所占用的空间大小，
通常以磁盘簇（cluster）为单位表示。
磁盘簇是操作系统用来管理磁盘空间的最小单位，它的大小取决于磁盘格式和簇大小设置。
如果文件的大小不是磁盘簇的整数倍，那么它所占用的磁盘空间将会超过实际的文件大小。&lt;/p&gt;
&lt;p&gt;例如，如果磁盘的簇大小为4KB，而一个文件的大小为1KB，
那么这个文件在磁盘上所占用的空间将是4KB，
因为它必须占用一个完整的磁盘簇。因此，在考虑磁盘空间时，
需要注意文件的磁盘大小，而不是文件的实际大小。&lt;/p&gt;</description></item><item><title>glob表达式</title><link>https://leafcxy.github.io/posts/2025-07-24-2/</link><pubDate>Thu, 24 Jul 2025 00:59:06 +0000</pubDate><guid>https://leafcxy.github.io/posts/2025-07-24-2/</guid><description>&lt;p&gt;Glob 表达式是一种用于匹配文件路径或名称的模式字符串。它在很多编程语言和操作系统中都被广泛使用，用于文件系统操作、文件搜索和筛选等场景。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Glob 表达式使用特定的通配符字符来表示匹配规则，常见的通配符包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;*&lt;/code&gt;：匹配任意数量的字符（包括零个字符）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;?&lt;/code&gt;：匹配单个字符。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[...]&lt;/code&gt;：匹配方括号中指定的字符范围中的任意一个字符。例如，&lt;code&gt;[abc]&lt;/code&gt; 匹配 &lt;code&gt;a&lt;/code&gt;、&lt;code&gt;b&lt;/code&gt; 或 &lt;code&gt;c&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[!...]&lt;/code&gt;：匹配不在方括号中指定的字符范围中的任意一个字符。例如，&lt;code&gt;[!abc]&lt;/code&gt; 匹配除了 &lt;code&gt;a&lt;/code&gt;、&lt;code&gt;b&lt;/code&gt; 和 &lt;code&gt;c&lt;/code&gt; 之外的任意字符。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下是一些示例：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;*.txt&lt;/code&gt;：匹配所有以 &lt;code&gt;.txt&lt;/code&gt; 结尾的文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;file?.txt&lt;/code&gt;：匹配 &lt;code&gt;file1.txt&lt;/code&gt;、&lt;code&gt;file2.txt&lt;/code&gt; 等文件，但不匹配 &lt;code&gt;file.txt&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[abc]*.txt&lt;/code&gt;：匹配以 &lt;code&gt;a&lt;/code&gt;、&lt;code&gt;b&lt;/code&gt; 或 &lt;code&gt;c&lt;/code&gt; 开头，并以 &lt;code&gt;.txt&lt;/code&gt; 结尾的文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;file[!0-9].txt&lt;/code&gt;：匹配以 &lt;code&gt;file&lt;/code&gt; 开头，后面跟一个非数字字符，并以 &lt;code&gt;.txt&lt;/code&gt; 结尾的文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;需要注意的是，Glob 表达式通常是大小写敏感的，但在某些环境中可以通过设置来改变这种行为。&lt;/p&gt;
&lt;p&gt;在 C# 中，&lt;code&gt;System.IO&lt;/code&gt; 命名空间提供了 &lt;code&gt;Directory&lt;/code&gt; 和 &lt;code&gt;Path&lt;/code&gt; 类来处理文件和目录操作，可以使用 &lt;code&gt;Directory.GetFiles&lt;/code&gt; 方法来根据 Glob 表达式获取匹配的文件路径。&lt;/p&gt;
&lt;p&gt;总而言之，Glob 表达式是一种简单而强大的模式匹配工具，用于在文件系统中按照特定规则进行文件匹配和筛选。&lt;/p&gt;</description></item><item><title>钩子在Win7下无效</title><link>https://leafcxy.github.io/posts/2025-07-23-5/</link><pubDate>Wed, 23 Jul 2025 02:22:56 +0000</pubDate><guid>https://leafcxy.github.io/posts/2025-07-23-5/</guid><description>&lt;p&gt;最近工作需要，用到了鼠标钩子，并且还是全局鼠标钩子，也就是说，这个钩子监视系统所有消息，因此启动这个功能后，发现程序性能有点受影响，这也是正常的。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;但是，原本在xp上运行好好的，放到win7上进行测试，发现过段时间，钩子会自动无效掉，这个时候去人工卸载钩子会弹出无效句柄错误消息(Error Code: 1404)。&lt;/p&gt;
&lt;p&gt;这个问题类似指针，指针开始时分配了内存，但过段时间后，指针与该内存切断了联系，但指针指向的值并不是NULL，这个时候去卸载(delete)操作，则肯定是非法的。&lt;/p&gt;
&lt;p&gt;所以，反复在网上查找相关的资料和论坛，发现大家都认为要么是win7下权限问题(UAC，管理员身份运行)，或者是全局钩子与dl有关的影响，又或者是新版本.Net不支持全局钩子(因为我使用C#调用API)，再或者是钩子句柄应该放在代码段区域(code_seg)等等。&lt;/p&gt;
&lt;p&gt;最后在msdn论坛上找到了解答：（Hooking problem in Windows 7）&lt;/p&gt;
&lt;p&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/windowscompatibility/thread/f6032ca1-31b8-4ad5-be39-f78dd29952da"&gt;http://social.msdn.microsoft.com/Forums/en-US/windowscompatibility/thread/f6032ca1-31b8-4ad5-be39-f78dd29952da&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;大概意思就是：
Win7移除超时的钩子不是bug，而是win7中为了保护系统而故意的行为，因为安装了全局钩子后，所以消息都要经过这个钩子，并且等待钩子过程执行结束或者钩子达到超时时间才能处理其他的响应，严重影响性能。
其实在vista中已经加入了一些保护措施，但不是很充分，所以在win7加入了当底层钩子多次超时时，就由系统自动卸载掉该钩子。&lt;/p&gt;
&lt;p&gt;所以，原因清楚了，方案有两个。
1.在win7系统中加入LowLevelHooksTimeout时间，如[HKEY_CURRENT_USER\Control Panel\Desktop]&amp;ldquo;LowLevelHooksTimeout&amp;rdquo;=dword:00002710
2.在安装钩子尽量在一个独立的线程中进行，并且钩子处理过程尽量用较短的时间，其他任何较长时间的处理都放在别的线程中异步处理。(尽量不要写花时间的hook代码)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DWORD WINAPI mouseLLHookThreadProc(LPVOID lParam)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MSG msg;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _hMouseLLHook = SetWindowsHookEx( WH_MOUSE_LL, .....);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt;(GetMessage(&amp;amp;msg, NULL, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) != FALSE)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TranslateMessage(&amp;amp;msg);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DispatchMessage(&amp;amp;msg);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>windows守护进程工具nssm</title><link>https://leafcxy.github.io/posts/2025-07-17/</link><pubDate>Thu, 17 Jul 2025 08:11:32 +0000</pubDate><guid>https://leafcxy.github.io/posts/2025-07-17/</guid><description>&lt;h2 id="nssm简介"&gt;nssm简介&lt;/h2&gt;
&lt;p&gt;nssm是一个服务封装程序，它可以将普通exe程序封装成服务，实现开机自启动，同类型的工具还有微软自己的srvany，不过nssm更加简单易用，并且功能强大。&lt;/p&gt;
&lt;p&gt;它的特点如下：&lt;/p&gt;
&lt;p&gt;支持普通exe程序（控制台程序或者带界面的Windows程序都可以）&lt;br&gt;
安装简单，修改方便&lt;br&gt;
可以自动守护封装了的服务，程序挂掉了后可以自动重启&lt;br&gt;
官网地址：https://nssm.cc/&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id="nssm配置详解"&gt;nssm配置详解&lt;/h2&gt;
&lt;h3 id="下载地址"&gt;下载地址&lt;/h3&gt;
&lt;p&gt;官网地址：https://nssm.cc/download&lt;/p&gt;
&lt;h3 id="解压压缩包根据系统位数选择64或32位程序"&gt;解压压缩包，根据系统位数选择64或32位程序&lt;/h3&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://leafcxy.github.io/images/2025/2025-1.png"&gt;&lt;/p&gt;
&lt;h3 id="打开命令行运行nssm程序"&gt;打开命令行，运行nssm程序&lt;/h3&gt;
&lt;p&gt;管理员权限打开命令行工具，切换到nssm.exe所在路径，运行 nssm install，打开程序配置界面
&lt;img loading="lazy" src="https://leafcxy.github.io/images/2025/2025-2.png"&gt;&lt;/p&gt;
&lt;p&gt;配置项说明：&lt;br&gt;
Path：运行应用程序的程序&lt;br&gt;
Startup directory：应用程序所在的目录&lt;br&gt;
Arguments：应用运行的参数&lt;br&gt;
Service name：生成服务的名称&lt;br&gt;
最后点击install service 完成windows服务安装，在windows服务列表就能看到创建的服务了。&lt;/p&gt;
&lt;h3 id="常用命令"&gt;常用命令&lt;/h3&gt;
&lt;p&gt;nssm install servername //创建servername服务，弹出配置界面&lt;br&gt;
nssm start servername //启动服务&lt;br&gt;
nssm stop servername //暂停服务&lt;br&gt;
nssm restart servername //重新启动服务&lt;br&gt;
nssm remove servername //删除创建的servername服务&lt;br&gt;
nssm edit servername//更改servername服务，弹出修改界面&lt;br&gt;
nssm set servername 参数名 参数值 //设置服务参数值&lt;br&gt;
sc delete servername//windows删除服务命令&lt;br&gt;
直接使用windows的服务管理也可以实现服务的操作，服务右键属性 - 恢复即可设置服务挂掉重启等内容。&lt;/p&gt;
&lt;h2 id="实战将应用做成服务"&gt;实战：将应用做成服务&lt;/h2&gt;
&lt;h3 id="程序说明"&gt;程序说明&lt;/h3&gt;
&lt;p&gt;这里演示将net6的web项目制作成windows服务&lt;br&gt;
应用的启动命令是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dotnet WebApplication_nssm.dll --urls&lt;span style="color:#f92672"&gt;=&lt;/span&gt;http://*:8888/ --port&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;8888&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="安装服务"&gt;安装服务&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nssm install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Path：C:&lt;span style="color:#ae81ff"&gt;\P&lt;/span&gt;rogram Files&lt;span style="color:#ae81ff"&gt;\d&lt;/span&gt;otnet&lt;span style="color:#ae81ff"&gt;\d&lt;/span&gt;otnet.exe
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Startup directory：D:&lt;span style="color:#ae81ff"&gt;\T&lt;/span&gt;echLearn&lt;span style="color:#ae81ff"&gt;\0&lt;/span&gt;01、Tools--nssm&lt;span style="color:#ae81ff"&gt;\W&lt;/span&gt;ebApplication_nssm&lt;span style="color:#ae81ff"&gt;\b&lt;/span&gt;in&lt;span style="color:#ae81ff"&gt;\D&lt;/span&gt;ebug&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;et6.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Arguments：WebApplication_nssm.dll --urls&lt;span style="color:#f92672"&gt;=&lt;/span&gt;http://*:8888/ --port&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;8888&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Service name：webapp8888
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最后点击install service 完成windows服务安装，在windows服务列表就能看到创建的服务了。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://leafcxy.github.io/images/2025/2025-3.png"&gt;
&lt;img loading="lazy" src="https://leafcxy.github.io/images/2025/2025-4.png"&gt;&lt;/p&gt;
&lt;h3 id="管理服务"&gt;管理服务&lt;/h3&gt;
&lt;h4 id="启动服务"&gt;启动服务&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;D:&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;ssm-2.24&lt;span style="color:#ae81ff"&gt;\w&lt;/span&gt;in64&amp;gt;nssm start webapp8888
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;webapp8888: START: 操作成功完成。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img loading="lazy" src="https://leafcxy.github.io/images/2025/2025-5.png"&gt;
&lt;img loading="lazy" src="https://leafcxy.github.io/images/2025/2025-6.png"&gt;&lt;/p&gt;
&lt;h4 id="关闭服务"&gt;关闭服务&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;D:&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;ssm-2.24&lt;span style="color:#ae81ff"&gt;\w&lt;/span&gt;in64&amp;gt;nssm stop webapp8888
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;webapp8888: STOP: 操作成功完成。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img loading="lazy" src="https://leafcxy.github.io/images/2025/2025-7.png"&gt;&lt;/p&gt;
&lt;h4 id="重启服务"&gt;重启服务&lt;/h4&gt;
&lt;p&gt;如果服务未启动就会直接启动，启动的会重启。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;D:&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;ssm-2.24&lt;span style="color:#ae81ff"&gt;\w&lt;/span&gt;in64&amp;gt;nssm restart webapp8888
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;webapp8888: STOP: 服务尚未启动。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;webapp8888: START: 操作成功完成。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;D:&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;ssm-2.24&lt;span style="color:#ae81ff"&gt;\w&lt;/span&gt;in64&amp;gt;nssm restart webapp8888
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;webapp8888: STOP: 操作成功完成。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;webapp8888: START: 操作成功完成。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="修改服务"&gt;修改服务&lt;/h4&gt;
&lt;p&gt;输入命令，修改配置，不能修改服务名&lt;/p&gt;</description></item></channel></rss>