我正在尝试编写一个简单的控制台程序,它将启动设备管理器并使用击键,导航它。到目前为止,我无法在设备管理器中注册密钥。
该程序可以很好地启动设备管理器,但设备管理器内部似乎没有按键操作。我知道使用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
答案 0 :(得分:3)
我建议您使用UI Automation技术。它适应了这种情况,这里有一个打开"键盘"节点,选择第一个键盘节点并模拟按下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}");
}