🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

2回答

3266閲覧

C#からタスクマネージャーの【ファイル→新しいタスクの実行(N)】のダイアログを開きたい。

ykondo

総合スコア3

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2021/03/18 09:48

編集2021/03/19 05:10

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コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/03/18 10:06

・ソースコードはコードの挿入で記入してください。 ・開発環境を記入してください。 OS、VisualStudioのバージョン プロジェクトの種類(WindowsForms、WPF、コンソール等)、 フレームワークの種類(.NET Framework X.XX、.NETCore X.X等) ・エラーが発生しているなら、内容は可能な限り詳細に記述してください。VisualStudioでのデバッグ中なら、詳細のコピーでクリップボードにコピーできます。
ykondo

2021/03/19 01:01

ご指摘、誠にありがとうございました。 質問を修正致しました。 ご教授頂ければ、幸いでございます。
guest

回答2

0

自アプリのEXEを管理者権限で実行させるようにしてみたらどうですかね?
そうすれば、タスクマネージャを経由せずとも普通にProcess.Startで実行できそうですが。
マニフェストファイルを使用して、起動時に自動で管理者に昇格させるようにする

投稿2021/03/19 04:47

編集2021/03/19 04:49
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ykondo

2021/03/19 05:26

radian様、ありがとうございます。 少し難しくなってきたので、まずはお礼を申し上げ、後程ゆっくり試してみたいと思っております。 今後の勉強の為にも、③の方法も知りたいので、こちらの方もご教授頂けたら、幸いです。
退会済みユーザー

退会済みユーザー

2021/03/19 06:03 編集

どうしても③の方法で行きたいのであれば、SendInputでキー入力を送り付けるなりすれば出来るとは思いますが、タスクマネージャのUIが今後も同じとは限らないので、正直止めた方がいいと思いますよ。(絶対そっちの方が面倒くさいし、信頼性に欠けるので)
ykondo

2021/03/19 11:05

ありがとうございます。 ご指摘通り、自アプリのEXEを管理者権限で実行できるよう、勉強して頑張ってみます。
guest

0

管理者昇格での起動という部分ならdobonさんの下記内容は参考にならないでしょうか?

https://dobon.net/vb/dotnet/system/runelevated.html#section2

投稿2021/03/19 00:05

編集2021/03/19 01:59
dekaaki

総合スコア292

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ykondo

2021/03/19 01:04

ありがとうございます。 大変申し訳ないのですが、貴殿が示されたHPは閲覧できませんでした。 Radian様のご指摘に基づき、質問内容を修正致しましたので、もう一度、見て頂けると幸いでございます。
dodox86

2021/03/19 01:13

> 示されたHPは閲覧できませんでした。 リンクの"https://" のコロン':'が無いようです。手動で付けてあげれば行けます。
dekaaki

2021/03/19 02:00

すみません。プロトコル部分を2重で書いてしまっていました。投稿内容の方を修正いたしました
dekaaki

2021/03/19 02:02

ykondoさん。 windowsformということなのでdobonさんの例(リンク先)を参考に当初のprocess.startに戻せそうな気がします
dekaaki

2021/03/19 02:25

もし私が示したリンク先の内容でいい場合、実行するボタンに盾アイコンの表示を忘れずに(その点もdobonさんのサイトに記載があります)
ykondo

2021/03/19 03:06

dekaakiさん、何度もありがとうございます。 早速試してみましたが、やはり、同じ起動エラーコードが出てしまいます。 TOS_ERROR CreateProcess returned 5(アクセスが拒否されました。) Process.Start()は、NotePadやExcel等ではうまくいくというのは確認済みなのですが、私が使用したいEding-CNCのソフトだけは、何故かうまく起動してくれないのです。 Eding-CNCのアイコンクリック以外にうまく起動できる方法は、③のみなのです。 ②でもうまくいけそうと思うのですが、質問内で述べたとおりです。 コマンドは、C:\CNC4.03\cnc.exe -verb runas を使用しました。
dekaaki

2021/03/19 04:06

どのようなプログラムで試されました? 私の環境でメモ帳で試したところ管理者権限できちんと起動できていました。 ※管理者権限が無いと書き込めないファイルで上書き保存で試しました。 RunElevated(@"C:\WINDOWS\system32\notepad.exe", @"C:\Windows\System32\drivers\etc\hosts", this, false); 私のOSのUACの設定状況だとボタンを実行したときに、ちゃんと昇格のダイアログが表示されましたがその辺りの動きはどうでしたか?
ykondo

2021/03/19 05:19

当方でもメモ帳やexcel等は、うまくいくのですが、何故かこのソフトだけがうまくいかないので、苦肉の策として、③の方法を行いたいと考えたわけです。 ちゃんと、昇格のダイアログは表示されましたが、起動エラーでした。 ③の方法も試してみたいのですが、難しいですか?
dodox86

2021/03/19 05:28

横からすみません。そもそもですが、"-verb runas"と言うオプションはどこから出てきたものでしょうか。 ②の方法でSendMessageで...とありますが、何を行っているか(少なくとも私にとって)謎です。 Windowsのシェルを使わない、別回答にあるradianさんご提案の方法もシンプルで良いと思います。
dekaaki

2021/03/19 05:39

そうですね。 dobonさんに書かれてる方法でだめならradianさんの方法もシンプルだと思います。 (でもそれでうまくいくならdobonさんの方法でもうまくいく気はしますが…)
退会済みユーザー

退会済みユーザー

2021/03/19 05:55 編集

エラーからして権限関係だと思うので、この方法でも行けそうだと思うんですけどね… Process.Startに渡しているパラメータに問題があるのかもしれません。
dodox86

2021/03/19 06:03

アイコンのクリック(デスクトップやスタートメニュー上のショートカット?)からの起動はOKと言うことですが、そのショートカットのコマンドラインも単純ではなくて、何らかのランチャーを経由しているとか、オプションが付与されているとかは確認されましたか?>@質問者さん
dekaaki

2021/03/19 08:22

それと気になるのが示した例で管理者起動したときのエラーってアクセス拒否でしょうか? 対象アプリの作り次第ですが、プロセスを起動したときの作業フォルダ関連の可能性はないのでしょうか
ykondo

2021/03/19 11:27

dodox86様 1.②の方法は、C#からProcess.Startで【ファイル名を指定して実行】のダイアログを起動し、その後、C#からそのウインドウハンドルを検索し、そのウインドウハンドル(hWndに格納)に対して、edit部にSendMessageでコマンド(c:\cnc4.03\cnc.exe -verb runas)を送信し、Buttonn部にSendMessage(hWnd,WM_LBUTTONDOWN, MK_LBUTTON, null); SendMessage(hWnd, WM_LBUTTONUP, 0x00000000, null); を送信して起動させようとしても、起動はできるのですが、管理者として起動できていないということです。 2. きちんと起動できるショートカットのリンク先は、C:\CNC4.03\cnc.exeとなっております。 3. TOS_ERROR CreateProcess returned 5(アクセスが拒否されました。)が、何のエラーなのか、当方ではさっぱりわかりません。申し訳ございません。 radian様・dekaaki様・dodox86様 お手を煩わせてしまい、誠に申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問