好的,这是一种奇怪的行为,我会尽力描述它:我编写了一个非常短的 C# 程序,它将我桌面上所有 *.png 文件的名称发送到记事本。首先,我启动 notepad.exe,在 TaskManager 中检查 PID,然后将 PID 输入到我的 C# 程序中(以便 AppActivate 知道在发送密钥之前它应该关注哪个 PID)。然后我通过 csc.exe编译myprogram.cs并执行它。
这是 C# 程序:
using System;
using System.Reflection;
using System.IO;
namespace MyApp {
class MyClass {
static void Main(string[] args) {
Type type = Type.GetTypeFromProgID("WScript.Shell"); // Get a WScript.Shell object
object inst = Activator.CreateInstance(type);
object catchReturn;
string[] myfiles = Directory.GetFiles(@"U:\Desktop", "*.png"); // Get all .png files on the Desktop
foreach (string myfile in myfiles){
catchReturn = (object)type.InvokeMember("AppActivate", BindingFlags.InvokeMethod, null, inst, new object[]{"7080"}); // 7080 is the PID that I looked up in Windows TaskManager
// When I send the keys to the console instead of notepad, I comment out the line above
catchReturn = (object)type.InvokeMember("SendKeys", BindingFlags.InvokeMethod, null, inst, new object[]{myfile + " ", true}); // I send the filename <myfile> and set SendKeys' second parameter to true
}
}
}
}
这是程序打印到记事本的内容:
U:Destop\wof.png U:\Desktop\Bild1.png U:\Desktop\leipzig_koeln_freitag.png U:\Desktop\leipzig_koeln_sonntag.png U:\Desktop\npp.png U:\Desktop\eztwain.png
第一个 png 实际上是 wolf.png,而不是 wof.png。显然位置是 U:\Desktop,而不是 U:Destop。字母被随机吞下。如果我再次执行该程序,其他字母会被吞掉。
但是,如果我省略 AppActivate (意思是,我将 .png 名称打印到调用myprogram.exe的控制台),没有一个字母会被吞下!
我特别想知道为什么字母会在随机位置被吞下,而不是例如只有前x 个字符?