返回列表 发帖

[问题求助] 把C#代码转为powershell遇到的问题

本帖最后由 小白龙 于 2025-3-25 12:02 编辑

下面的C#代码是gpt从python代码转换过来的, 可以在老版(5.X或6.X)的剪映导航窗口自动打开指定的草稿,
但是有个问题, 有时不知道为啥对象e就报错了, 然后重启剪映导航窗口就可以了, 后面我又用gpt转成powershell, 但是死活就是无法执行, 总是报错, 求路过精通C#和powershell的大佬指导, 多谢
using FlaUI.UIA3;
using FlaUI.Core.Conditions;
var apps = Process.GetProcessesByName("JianyingPro")
   .Where(p => p.MainWindowHandle != IntPtr.Zero);
using var automation = new UIA3Automation();
IntPtr mainWindowHandle = apps.First().MainWindowHandle;
var mainWindow = automation.FromHandle((nint)mainWindowHandle);
var condition = new PropertyCondition(automation.PropertyLibrary.Element.FullDescription, "HomePageDraftTitle:3月22日");
var e = mainWindow.FindFirstDescendant(condition);
e.Parent.Click();COPY
Powershell代码:
Add-Type -Path ".\FlaUI.UIA3.dll"
try {
    $apps = Get-Process "JianyingPro" | ? { $_.MainWindowHandle -ne 0 }
    $automation = New-Object "FlaUI.UIA3.UIA3Automation"
    $mainWindowHandle = $apps[0].MainWindowHandle
    $mainWindow = $automation.FromHandle($mainWindowHandle);
    $condition = New-Object "PropertyCondition" `
        @($automation.PropertyLibrary.Element.FullDescription, "HomePageDraftTitle:3月22日")
    $e = $mainWindow.FindFirstDescendant($condition)
    $e.Parent.Click()
}
catch {
    Write-Error "发生错误: $_"
}
finally {
    # 确保释放资源
    if ($automation) { $automation.Dispose() }
}COPY

Powershell代码的话应该是第9行那个类型名字吧 ,得用全名称 FlaUI.Core.Conditions.PropertyCondition
C#代码的话 ,如果安装了winsdk或者Visual Studio ,可以用windows kids文件夹下的inspect.exe自己研究看看  ,运行剪映 ,然后运行inspect.exe ,看看是怎样的 , 点击窗口时是怎样的 ,关闭窗口时是怎样的 ,出错时又是怎样的

TOP

回复 2# Five66


    感谢大佬, 我发现不是powershell转换的代码的问题, 是C#的代码的问题, 在powershell上仍然存在, 就是不知道回复, e对象就报错了, 只能重启剪遇才能OK, 剪映运行后有4个进程, 可能问题在这里, 怎么解决呢

TOP

回复 3# 小白龙


    枚举 ,全部进程都查找一下 ,哪个找到哪个符合就哪个

TOP

回复 4# Five66


    这个代码应该没错的, gpt问了好多次
Get-Process "JianyingPro" | ? { $_.MainWindowHandle -ne 0 }

TOP

回复 5# 小白龙


    是 IntPtr mainWindowHandle = apps.First().MainWindowHandle; 中的 apps.First() ,只取了apps 数组中的第1个

TOP

回复 6# Five66
下面这个执行后, 其实就1个了

    var apps = Process.GetProcessesByName("JianyingPro")
                                                           .Where(p => p.MainWindowHandle != IntPtr.Zero);

TOP

回复 7# 小白龙


    同一进程实例确实只有一个 ,不同进程实例不止一个

TOP

还有一点 ,如果程序已经最小化或者没显示在任务栏或者隐藏了 ,MainWindowHandle属性有可能为0

TOP

回复 9# Five66


    没有最小化, 但是没有在最顶层, 但是不在最顶层时, 大多是可以的

TOP

既然这么多csharp要转成ps 不如写个脚本直接编译cs 运行exe呢 ps慢的不得了
你好

TOP

返回列表