Device Manager交互发送键

本文关键字:交互 Manager Device | 更新日期: 2023-09-27 18:21:07

我正在尝试编写一个简单的控制台程序,该程序将启动设备管理器,并通过按键进行导航。到目前为止,我无法让他们在设备管理器中注册按键。

该程序启动设备管理器很好,但设备管理器内似乎没有按键。我知道设备管理器的树部分使用Spy++称为SysTreeView32。

有什么建议吗?

这是我迄今为止的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Windows.Forms;
using System.Threading;
using System.Runtime.InteropServices;
namespace Dev_Mgr_Auto
{
class Program
{
    [DllImport("user32.dll", EntryPoint = "FindWindow")]
    private static extern IntPtr FindWindow(string lp1, string lp2);
    [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetForegroundWindow(IntPtr hWnd);


    static void Main(string[] args)
    {
        //start Device Manager
        Process.Start("devmgmt.msc");
         Thread.Sleep(1500);
        // find window handle of Device manager
         IntPtr handle = FindWindow("MMCMainFrame", "Device Manager");
        if (!handle.Equals(IntPtr.Zero))
        {
            // activate Device Danager window
            if (SetForegroundWindow(handle))
            {
                // send key "Tab"
                SendKeys.SendWait("{TAB}");
                // send key "Down" x 4
                SendKeys.SendWait("DOWN 4");
            }
        }

    }//end main
}//end class
}// end program

EDIT1:您必须以管理员身份运行程序才能使其工作

最终代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Windows.Forms;
using System.Threading;
using System.Runtime.InteropServices;
using System.Windows.Automation;
namespace Video_Card_Updater
{
    class Program
{
    [DllImport("user32.dll", EntryPoint = "FindWindow")]
    private static extern IntPtr FindWindow(string lp1, string lp2);
    [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetForegroundWindow(IntPtr hWnd);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
    static void Main(string[] args)
    {
       // this code needs a reference to UIAutomationClient and UIAutomationTypes
    Process process = Process.Start("devmgmt.msc");
    do
    {
        process.Refresh();
        Thread.Sleep(100);
    }
    while (process.MainWindowHandle == IntPtr.Zero);
    // get root element that corresponds to the process main window
    AutomationElement mainWindow = AutomationElement.FromHandle(process.MainWindowHandle);
    // get the first tree view control by its class name
    AutomationElement treeView = mainWindow.FindFirst(TreeScope.Subtree, new PropertyCondition(AutomationElement.ClassNameProperty, "SysTreeView32"));       
    // get the "Keyboards" node by its name
    AutomationElement Display = treeView.FindFirst(TreeScope.Subtree, new PropertyCondition(AutomationElement.NameProperty, "Display adapters"));
    // expand item
    ((ExpandCollapsePattern)Display.GetCurrentPattern(ExpandCollapsePattern.Pattern)).Expand();
    // get first display
    AutomationElement firstDisplay = Display.FindFirst(TreeScope.Children, PropertyCondition.TrueCondition);
    // set focus to display and do the following key commands:
    firstDisplay.SetFocus();
    SendKeys.SendWait("{ENTER}");
    Thread.Sleep(100);
    SendKeys.SendWait("{TAB 3}");
    Thread.Sleep(100);
    SendKeys.SendWait("{RIGHT}");
    Thread.Sleep(100);
    //ALT + P
    SendKeys.SendWait("%P");
    Thread.Sleep(100);
    SendKeys.SendWait("{ENTER}");
     } // end main

   }//end class
}// end program

Device Manager交互发送键

我建议您改用UI自动化技术。它适用于这种情况,这里有一个打开"Keyboards"节点的示例,选择第一个键盘节点并模拟按ENTER键:

    static void Main(string[] args)
    {
        // this code needs a reference to UIAutomationClient and UIAutomationTypes
        Process process = Process.Start("devmgmt.msc");
        do
        {
            process.Refresh();
            Thread.Sleep(100);
        }
        while (process.MainWindowHandle == IntPtr.Zero);
        // get root element that corresponds to the process main window
        AutomationElement mainWindow = AutomationElement.FromHandle(process.MainWindowHandle);
        // get the first tree view control by its class name
        AutomationElement treeView = mainWindow.FindFirst(TreeScope.Subtree, new PropertyCondition(AutomationElement.ClassNameProperty, "SysTreeView32"));
        // get the "Keyboards" node by its name
        AutomationElement keyBoards = treeView.FindFirst(TreeScope.Subtree, new PropertyCondition(AutomationElement.NameProperty, "Keyboards"));
        // expand item
        ((ExpandCollapsePattern)keyBoards.GetCurrentPattern(ExpandCollapsePattern.Pattern)).Expand();
        // get first keyboard
        AutomationElement firstKeyboard = keyBoards.FindFirst(TreeScope.Children, PropertyCondition.TrueCondition);
        // open the first keyboard properties (focus + press ENTER)
        firstKeyboard.SetFocus();
        SendKeys.SendWait("{ENTER}");
    }