C#で書いている自作プログラムからタスクマネージャーの【ファイル→新しいタスクの実行(N)】のダイアログを開きたいと考えております。
理由は、 Eding-CNCというソフトを起動させたいのですが、
① Process.Startを使用しても、起動Errorが起こり、立ち上がらない。
エラー内容 TOS_ERROR CreateProcess returned 5(アクセスが拒否されました。)
② Process.Startで【ファイル名を指定して実行】を起動し、ウインドウハンドル検索後、SendMessageでコマンドを送信( -verb runasを付与 )して起動させようとしても、管理者として起動できない。
Eding-CNC側の方で、【 server priority not REALTIME, Please start as administrator 】という警告が出てしまいます。
③ 新しいタスクの実行(N)で、「このタスクに管理者特権を付与して作成します。」にチェックを入れて起動すると、きちんと起動する。
からです。
そこで、下記のプログラムを組んだのですが、タスクマネージャーの起動、タスクマネージャーのウインドウハンドル、タスクマネージャーのメニューハンドル( ファイル-インデックス番号 0 )の取得まではできたのですが、
1⃣【ファイル】のサブメニューにある【新しいタスクの実行(N)】を選択して、『新しいタスクの作成ダイアログ』を開く方法
2⃣「このタスクに管理者特権を付与して作成します。」にチェックを入れる方法
がわかりません。
ダイアログさえ開ければ、同じようにEditに起動コマンドを送信し、OK-Buttonにクリック操作をSendMessageで送ってあげれば、立ち上がってくれると考えております。
何卒ご教授願います。
開発環境 Windows10 VisualStudio2019
プロジェクトの種類 WindowsForms
フレームワークの種類 .NET Framework4.7.2
using
1using System.Collections.Generic; 2using System.ComponentModel; 3using System.Data; 4using System.Drawing; 5using System.Linq; 6using System.Text; 7using System.Threading.Tasks; 8using System.Windows.Forms; 9using System.Diagnostics; 10using System.Runtime.InteropServices; 11 12namespace ExternalProgramLoadTest 13{ 14 public partial class Form1 : Form 15 { 16 [DllImport("user32.dll", CharSet = CharSet.Auto)] 17 static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 18 19 [DllImport("user32.dll", CharSet = CharSet.Auto)] 20 static extern IntPtr FindWindowEx(IntPtr hWndParent, IntPtr hWndChildAfter, string lpClassName, string lpWindowName); 21 22 [DllImport("User32.dll")] 23 public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam); 24 25 [DllImport("user32.dll")] 26 static extern int GetMenu(int hWnd); 27 28 [DllImport("user32.dll")] 29 static extern IntPtr GetSubMenu(IntPtr hMenu, int nPos); 30 31 [DllImport("user32.dll")] 32 static extern bool SetForegroundWindow(IntPtr hWnd); 33 34 [DllImport("user32.dll")] 35 static extern int TrackPopupMenu(IntPtr hMenu, int uFlags, int x, int y, int nReserved, IntPtr hWnd, IntPtr prcRect); 36 37 private const int WM_SETTEXT = 0x000c; 38 39 private const int WM_LBUTTONDOWN = 0x201; 40 private const int WM_LBUTTONUP = 0x202; 41 private const int MK_LBUTTON = 0x0001; 42 43 private const int WM_COMMAND = 0x0111; 44 45 private const int TPM_LEFTBUTTON = 0; 46 private const int TPM_RETURNCMD = 0x100; 47 48 public Form1() 49 { 50 InitializeComponent(); 51 } 52 53 private void button1_Click(object sender, EventArgs e) 54 { 55 ProcessStartInfo pInfo = new ProcessStartInfo(); 56 pInfo.FileName = "taskmgr"; 57 //pInfo.Verb = "RunAs"; 58 pInfo.UseShellExecute = true; 59 Process.Start(pInfo); 60 61 System.Threading.Thread.Sleep(1000); 62 63 IntPtr hWnd = FindWindow("TaskManagerWindow", "タスク マネージャー"); 64 textBox1.AppendText(Convert.ToString(hWnd.ToInt32(), 16) + "\r" + "\n"); 65 66 if (hWnd != IntPtr.Zero) 67 { 68 //メニューハンドル取得 69 int MenuhWnd = GetMenu(hWnd.ToInt32()); 70 textBox1.AppendText(Convert.ToString(MenuhWnd, 16) + "\r" + "\n"); 71 72 if (MenuhWnd != 0) 73 { 74 //サブメニューのハンドルを取得 第2引数はインデックス番号を指定 75 IntPtr SubMenuhWnd = GetSubMenu((IntPtr)MenuhWnd, 0); 76 textBox1.AppendText(Convert.ToString(SubMenuhWnd.ToInt32(), 16) + "\r" + "\n"); 77 78 // 以下に1⃣のコードを書きたい。 79 80 /* 81 //自分自身を最前面へ 82 SetForegroundWindow((IntPtr)this.Handle); 83 84 //選択したメニュー項目のIDを取得 85 int intID = TrackPopupMenu(SubMenuhWnd, TPM_LEFTBUTTON | TPM_RETURNCMD, 86 this.Left, this.Top, 0, (IntPtr)this.Handle, (IntPtr)0); 87 textBox1.AppendText(intID.ToString() + "\r" + "\n"); 88 89 //メッセージ送信 90 int ret = SendMessage(hWnd, WM_COMMAND, intID, null); 91 //textBox1.AppendText(ret.ToString() + "\r" + "\n"); 92 */ 93 } 94 else 95 { 96 MessageBox.Show("メニューハンドル取得失敗!"); 97 } 98 } 99 else 100 { 101 MessageBox.Show("タスクマネージャーが見つかりませんでした。"); 102 } 103 104 105 hWnd = FindWindow("#32770", "新しいタスクの作成"); 106 textBox1.AppendText(Convert.ToString(hWnd.ToInt32(), 16) + "\r" + "\n"); 107 108 if (hWnd != IntPtr.Zero) 109 { 110 IntPtr hWnd_Edit = FindWindowEx(hWnd, IntPtr.Zero, "ComboBox", null); 111 IntPtr hWnd_Admin = FindWindowEx(hWnd, IntPtr.Zero, "Button", "このタスクに管理者特権を付与して作成します。"); 112 IntPtr hWnd_Button = FindWindowEx(hWnd, IntPtr.Zero, "Button", "OK"); 113 114 textBox1.AppendText(Convert.ToString(hWnd_Edit.ToInt32(), 16) + "\r" + "\n"); 115 textBox1.AppendText(Convert.ToString(hWnd_Admin.ToInt32(), 16) + "\r" + "\n"); 116 textBox1.AppendText(Convert.ToString(hWnd_Button.ToInt32(), 16) + "\r" + "\n"); 117 118 SendMessage(hWnd_Edit, WM_SETTEXT, 0, @"C:\CNC4.03\cnc.exe -verb runas"); 119 System.Threading.Thread.Sleep(100); 120 121 SendMessage(hWnd_Admin, WM_LBUTTONDOWN, MK_LBUTTON, null); 122 SendMessage(hWnd_Admin, WM_LBUTTONUP, 0x00000000, null); 123 System.Threading.Thread.Sleep(100); 124 125 SendMessage(hWnd_Button, WM_LBUTTONDOWN, MK_LBUTTON, null); 126 SendMessage(hWnd_Button, WM_LBUTTONUP, 0x00000000, null); 127 } 128 else 129 { 130 MessageBox.Show("新しいタスクの作成ダイアログが見つかりませんでした。"); 131 } 132 } 133 } 134} 135コード