新任务,要打开设置页面,并移动到指定位置,并设定窗口大小。
打开设置和移动窗口是非常简单,直接用ShellExecute和MoveWindow就可以了,上代码:
using System;
using System.Runtime.InteropServices;
namespace OpenWindows
{
class Program
{
static void Main(string[] args)
{
ShellExecute(IntPtr.Zero, "open", "ms-settings:storagesense", "", null, 9);
IntPtr handle = (IntPtr)0x00030E7E;
MoveWindow(handle, 960, 0, 960, 1050, true);
}
[DllImport("Shell32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr ShellExecute(IntPtr hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd);
[DllImport("User32.dll")]
static extern bool MoveWindow(IntPtr handle, int x, int y, int width, int height, bool redraw);
}
}
一切顺利,现在来看,只要获取设置窗口的句柄就可以了,本以为是个小问题,但是却花费了大量的时间。
首先,获取设置窗口的句柄,肯定先想着通过setting的进程ID来获取他对应的窗口句柄就行了,先拿进程id,这里的函数为:GetProcessesByName,拿到后发现有一个MainWindowHandle属性,nice,看样子一下子就解决了,以下是代码:
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace OpenWindows
{
class Program
{
static void Main(string[] args)
{
ShellExecute(IntPtr.Zero, "open", "ms-settings:storagesense", "", null, 9);
var setingProcesses = Process.GetProcessesByName("SYSTEMSETTINGS");
//var setingId = setingProcesses[0].Id;
var setingMainWindowHandle = setingProcesses[0].MainWindowHandle;
MoveWindow(setingMainWindowHandle, 960, 0, 960, 1050, true);
}
[DllImport("Shell32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr ShellExecute(IntPtr hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd);
[DllImport("User32.dll")]