首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从windows窗体内部调用devcon无法工作

从windows窗体内部调用devcon无法工作
EN

Stack Overflow用户
提问于 2022-05-03 20:24:48
回答 3查看 507关注 0票数 3

计划

计划是从windows窗体应用程序中禁用并随后启用设备。为了测试我的计划的第一个构建块,我使用管理权限打开cmd,以下操作非常完美:

代码语言:javascript
复制
> devcon hwids =ports
> devcon hwids *VID_10C4*
> devcon disable *VID_10C4*
> devcon enable *VID_10C4*

我可以在设备管理器中看到设备被禁用并再次启用。

我还可以通过将命令放入批处理文件并以管理权限从cmd运行所有这些命令。以上所述告诉我,我的计划基本上是好的。

应用程序

然而,我实际上想要做的是在windows窗体应用程序中实现相同的目标:

  1. 我在应用程序清单中设置了以下内容:

uiAccess="false" requestedExecutionLevel level="requireAdministrator“

  1. 为了初步的步骤,我检查了它,只是为了确保在路径和其他方面没有愚蠢的错误。而且效果很好。日志文件显示dir命令的预期输出。

//构建字符串字符串strCmdText = "'/c cd“+ prodPath +”& dir“+”> logs\logFileEnablePrt.txt \“;//运行命令var p=新的System.Diagnostics.Process();var psi =新的ProcessStartInfo("CMD.exe",strCmdText);psi.Verb = "runas";//管理权限p.StartInfo = psi;p.WaitForExit();;p.Start()

然而,

  1. 不起作用。它总是返回一个空日志文件,并且不按预期更改设备:

//构建字符串字符串strCmdText = "'/c cd“+ prodPath +”& devcon =端口“+”> logs\logFileEnablePrt.txt \“;//运行命令var p=新的System.Diagnostics.Process();var psi =新ProcessStartInfo("CMD.exe",strCmdText);psi.Verb = "runas";// admin rights p.StartInfo = psi;p.WaitForExit();;p.Start()

cmd窗口中的错误是:

代码语言:javascript
复制
'devcon' is not recognized as an internal or external command,

可操作的程序或批处理文件。

到底怎么回事?

以上这些让我感到困惑。我已经证明了命令是有效的。我已经证明了我的C#代码是有效的。但当我加入2组的时候,它不起作用.

注:我的C#程序运行在我的D:驱动器上,如果这有什么不同.

基于评论的更新

@Compo使用您的代码,它的操作与我的完全相同。我看到一个空日志文件&没有对设备进行任何更改。我将/c更改为/k,这样我就可以看到cmd终端上发生了什么,我看到了以下内容:

我甚至尝试过您的代码C:\\Windows\\System32\\devcon hwids =usb直接指向devcon。同时也尝试了\devcon.exe的完整性。令人费解的错误是:

我可以看到翻转的devcon.exe文件就坐在那里的文件夹!它有什么理由不承认它呢?

另外,使用您编写的命令,日志文件名实际上是logFileEnablePrt.txt‘。我同意你的命令看起来是对的,所以不要问我为什么会这样!

@Panagiotis Kanavos使用您的代码,我得到以下错误:

这是在线p.Start();。我试着放入devcon.exe,甚至整个路径(我检查了文件夹在我的路径中,它确实在)。过不了这关。实际上,我无意中发现了你分享的答案,我已经来到了这堵砖墙。

EN

回答 3

Stack Overflow用户

发布于 2022-05-09 08:13:37

这是为我工作的代码,我没有端口设备,所以我把它改为usb。

代码语言:javascript
复制
public static void Main()
{
    string prodPath = @"c:\devcon\x64";

    // Build String 
    string strCmdText =
    "/c \"cd /d " + prodPath +
    " && devcon hwids =usb " +
    " > log.txt \"";

    // Run command 
    var p = new Process();
    var psi = new ProcessStartInfo("CMD.exe", strCmdText);
    psi.Verb = "runas"; // admin rights
    p.StartInfo = psi;
    p.Start();
    p.WaitForExit();
}
票数 2
EN

Stack Overflow用户

发布于 2022-05-13 13:42:15

工作了几步认为我可能有答案..。

仅指定devcon失败,因为expected...windows找不到它所在的文件夹,因为它不在windows中的%PATH%变量中。

如果我指定了完整的路径,但是它能工作.

从原始代码中还不清楚,但是如果您的devcon副本位于System32或Syswow目录中,您可能也遇到了仿真问题.see here....

EDIT1::证明这一点的一种方法是执行Direcory.GetFiles(包含devcon的目录),并查看结果是否与您预期的一致。

至于将参数传递给devcon,我会尝试这样的方法,而不是试图连接一个巨大的cmd行。

一个类似的例子,但使用netstat:

编辑2::另一个例子,但与devcon:

构建的目标平台是x64。

EDIT3::将我的应用程序构建设置为x86:

票数 1
EN

Stack Overflow用户

发布于 2022-09-13 02:06:06

在研究了上面的答案和评论之后,我似乎有一些可靠的工作方法,显然我想分享给大家,以供仔细研究和将来使用。

所以,我的函数最后看起来是这样的:

代码语言:javascript
复制
    private int enablePort(string action)
    {
        while (true)
        {

        // Command Arg
            string devconPath = @"c:\Windows\SysNative";
            string strCmdText =
                "'/c \"cd /d \"" + 
                devconPath +
                "\" && c:\\Windows\\SysNative\\devcon " + action + " *VID_10C4* " +
                "> \"" + prodPath + "\\logs\\logFileEnablePrt.txt\"\"";

        // Process
            var p   = new Process();
            var psi = new ProcessStartInfo()
            {
                Arguments = strCmdText,
                Verb = "runas",
                FileName = "CMD.exe",
                UseShellExecute = true
            };
            p.StartInfo = psi;
            p.Start();
            p.WaitForExit();


                
        // Grab log output
            string logPath = prodPath + "\\logs\\logFileEnablePrt.txt";
            Console.WriteLine("logPath = " + logPath);
            string tempFile = System.IO.File.ReadAllText(logPath);
            System.Console.WriteLine("Contents of WriteText.txt = \n{0}", tempFile);


        // Check if it worked
            var success = false;
            if (tempFile.Contains(action))
            {
                success = true;
                return 0;
            }

            // Error  ->  Allow user to try again!
            if (MessageBox.Show("Was unable to " + action + " Test Jig COM port. Unlug & Replug USB. Check COM port is enabled if not working.", "COM Port Problem", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
            {
                return -1;
            }
        }
    }

呼叫代码是:

代码语言:javascript
复制
        this.enablePort("disable");
        int milliseconds = 3000;
        await Task.Delay(milliseconds);
        this.enablePort("enable");

正如您在上面的代码中所看到的,我记录了所有的内容,以了解发生了什么.通过调试器,我现在可以看到禁用之后:

USB\VID_10C4&PID_EA60\0001 :禁用1个设备。

然后在启用之后:

USB\VID_10C4&PID_EA60\0001 :启用了1个设备。

我需要强调的另一件事是,在测试期间,我认为我可以将串行外设连接到端口上,并通过检查连接来确定它是否可以成功地禁用和启用。这不管用。上述代码仅在端口空闲时才能工作。也许理解底层软件的人可能会冒险解释这是为什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72105087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档