質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.49%
C#

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

Q&A

解決済

2回答

10537閲覧

フォームに作成したボタンを押して、ソフトキーボード(osk.exe)を表示したい。

m_rase

総合スコア8

C#

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

0グッド

0クリップ

投稿2020/03/03 07:36

編集2020/03/03 08:53

前提・実現したいこと

フォームに作成したボタンを押して、ソフトキーボード(osk.exe)を表示したいです。
VisualStudio2019 C#のWindowsFormアプリを作成しています。

発生している問題・エラーメッセージ

System.ComponentModel.Win32Exception: '指定されたファイルが見つかりません。'

該当のソースコード

c#

1private void button1_Click(object sender, EventArgs e) 2{ 3//process1.Start(); 4 if (!Environment.Is64BitProcess) 5 System.Diagnostics.Process.Start("C:\Windows\sysnative\osk.exe"); 6 else 7 System.Diagnostics.Process.Start("C:\Windows\system32\osk.exe");  8}

試したこと

・ツールボックスのコンポーネントにある process をダブルクリックしてprosess1を作成。
●プロパティのその他>StartInfo>FileName からC:\Windows\System32 にあるosk.exeが表示されず選択できない。

・プロパティのその他>StartInfo>FileNameに手でC:\Windows\System32\osk.exe を入力。
・ボタンクリックからprocess1.start();を実行。
●System.ComponentModel.Win32Exception: '指定されたファイルが見つかりません。'

https://teratail.com/questions/58735
を参考に、ボタンから上記の該当のソースコードを実行。
●System.ComponentModel.Win32Exception: '指定されたパスが見つかりません。'

c#

1private void button1_Click(object sender, EventArgs e) 2{ 3 const string oskPath = "‪C:\Windows\sysnative\osk.exe"; 4 process1.StartInfo.FileName = oskPath; 5 process1.Start(); 6}

●System.ComponentModel.Win32Exception: '指定されたパスが見つかりません。'

c#

1private void button1_Click(object sender, EventArgs e) 2{ 3 string oskPath = System.IO.Path.Combine(Environment.SystemDirectory, "osk.exe"); 4 process1.StartInfo.FileName = oskPath; 5 process1.Start(); 6}

●System.ComponentModel.Win32Exception: '指定されたパスが見つかりません。'

1,2,3ともにosk.exeをnotepad.exeに変更すると実行される。

補足情報(FW/ツールのバージョンなど)

Windows10 64bit
VisualStudio2019

4,5を追加しましたが、32ビットのチェックが付いていると、同様のエラーになってしまいます。

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

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

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

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

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

guest

回答2

0

ベストアンサー

アプリケーションをx86で作成していませんか?

32ビットアプリですとC:\Windows\System32C:\Windows\SysWOW64にリダイレクトされます。
このために、64ビット版しか存在しないosk.exeは32ビットアプリからC:\Windows\System32にアクセスすると、実際にはC:\Windows\SysWOW64のファイルを見るのでosk.exeがないということになります。

C#

1System.Diagnostics.Process.Start(@"C:\Windows\sysnative\osk.exe");

とすればリダイレクトされずにSystem32フォルダを参照するので、32ビットアプリでもosk.exeが起動できるかと思います。

>プロパティのその他>StartInfo>FileName からC:\Windows\System32 にあるosk.exeが表示されず選択できない。
こちらについても、VisualStudioが32ビットアプリのため、SysWOW64にリダイレクトされている為に表示されない状態となっています。

追記
すみません。x64だとsysnativeでアクセスするとエラーとなりますね。

C#

1if(Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess) 2{ 3 Console.WriteLine("32ビットアプリ"); 4 System.Diagnostics.Process.Start(@"C:\Windows\sysnative\osk.exe"); 5} 6else 7{ 8 Console.WriteLine("64ビットアプリ"); 9 System.Diagnostics.Process.Start(@"C:\Windows\system32\osk.exe"); 10}

これで、AnyCPUで「32ビットを優先」にチェックを入れると32ビットアプリ側、チェックを外すと64ビットアプリ側を通りました。

さらに追記

上記回答時にテストしていたPCとは別のPCで確認したところ、質問者さんと同じと思われる状況になりました。
Windows10Pro 64bit バージョン1903の環境なのですが、32ビットのコマンドプロンプト(C:\Windows\SysWOW64\cmd.exe)にて下記のようになりました。

c:\>dir c:\windows\sysnative\osk.exe ドライブ C のボリューム ラベルは Windows です ボリューム シリアル番号は XXXX-XXXX です c:\windows\sysnative のディレクトリ 2019/11/19 15:02 642,560 osk.exe 1 個のファイル 642,560 バイト 0 個のディレクトリ 400,892,551,168 バイトの空き領域 c:\>c:\windows\sysnative\osk.exe ファイル c:\windows\sysnative\osk.exe が見つかりません。

dirでファイルが見つかるのに実行することが出来ません。
なぜ、このような現象になるのかは調べきれませんでした。

そこで、方向性を変えて、リダイレクトを無効化してみました。

C#

1[DllImport("kernel32.dll", SetLastError = true)] 2static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr); 3 4[DllImport("kernel32.dll", SetLastError = true)] 5static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr); 6 7private void Button1_Click(object sender, EventArgs e) 8{ 9 10 IntPtr wow64Value = IntPtr.Zero; 11 12 try 13 { 14 // File System Redirectorを無効化する 15 Wow64DisableWow64FsRedirection(ref wow64Value); 16 17 System.Diagnostics.Process.Start(@"C:\Windows\system32\osk.exe"); 18 19 } 20 finally 21 { 22 // File System Redirectorを有効化する 23 Wow64RevertWow64FsRedirection(wow64Value); 24 } 25}

こちらの方法ですと、質問者さんと同じであろう環境の方でも「32ビットを優先」のチェックに関わらずoskを起動することが出来ました。

投稿2020/03/03 08:02

編集2020/03/04 12:13
YAmaGNZ

総合スコア10242

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

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

m_rase

2020/03/03 08:42

回答ありがとうございました。 回答を試してみました。 また5)を追加で試してみましたが、これも32ビットのチェックを外さないとoskが実行されませんでした。
YAmaGNZ

2020/03/03 09:21 編集

追記したのですが、質問者さんの環境だとうまくいかないかもしれません。 私の環境ですと、質問で提示された最初のコードでも「32ビットを優先」のチェックに関わらず正常に動作しました。 タスクマネージャーで確認しましたが、32ビット優先時は32ビットでチェックを外した場合は64ビットでアプリケーションは動作していました。
m_rase

2020/03/03 09:37

回答ありがとうございます。 ボタンクリックにコピーし、無事、OSKが実行されました。ありがとうございます。 現在作成しているアプリでは、メモ帳と電卓はコンポーネントにある processを使って呼び出しています。ソフトキーボードは今回教えて頂いた方法で実行したいと思います。 厚かましいお願いなのですが、もしメモ帳と同様にprocessを使用した場合の実現方法をご存じであれば教えて頂けないでしょうか。
YAmaGNZ

2020/03/03 10:41

Processへ与えるパスを変更するだけかと思います。 質問の5)のoskPathの中身を私が提示したif文で変更するだけですよね
m_rase

2020/03/03 15:13

すみません。 出来たと思っていたのですが、32ビットのチェックを付けていない状態でした。 改めて、チェックを付けた状態で実行しましたところ、やはり指定されたパスが見つかりません。と出てしまいます。
YAmaGNZ

2020/03/03 20:43

チェックを付けた状態だと、32ビットアプリとして動作するのですが、プログラムのC:\Windows\sysnativeのほうを通っているかは確認しましたか?
YAmaGNZ

2020/03/04 00:19

もし32ビットでの実行になる関わらず64ビット側を通っているのであれば、system32側でファイルの存在チェックをして、存在すればそのままsystem32で、存在しなければsysnativeで実行するとかはどうですかね?
m_rase

2020/03/04 13:33

回答頂きありがとうございます。 "さらに追記"の方法で、32ビットを選ぶにチェックが入っていてもosk.exeを実行する事ができました。 x86、x64が何かも分かっていませんでした。初めて調べ、今回起きている現象については、理解できたつもりです。(なぜ起きているかは理解できていませんが…。) 本当にありがとうございました。
guest

0

自分の所で試した感じでは、デフォルトで32ビットで動作するように設定されているので、
このチェックを外す必要がありそうです(Debug/Release両方外しておくとよいかと)。

イメージ説明

このチェックを外せばAny CPUであれば、64bitOSでは64bitアプリとして動作するので、
if文のelseの方に入ってくれます。

ただ、デフォルトでチェックが入っているのは、なんらかの理由がありそうな気がするので、そのへんは調べてください。


追記:
いや、これはそもそも
Environment.Is64BitOperatingSystem の方で判別すればいいんじゃないですかね?
↑やっぱだめでした。32bitアプリからアクセスすると他のパスに飛ばされるのか・・・
.

投稿2020/03/03 07:54

編集2020/03/03 07:59
takabosoft

総合スコア8356

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

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

m_rase

2020/03/03 08:32

回答ありがとうございました。 32ビットのチェックを外すと、3)、5)の方法でキーボードが表示されました。ありがとうございます。 ご存じであれば、チェックを外さずに実現する方法を教えて頂きたいです。
takabosoft

2020/03/04 00:12

チェックを外さずに実現する方法は・・・ あらかじめC:\Windows\SysWOW64側にもosk.exeをコピーしちゃうことですかね(管理者権限ほしいと思いますが)
m_rase

2020/03/04 13:33

少し抵抗を感じながら試してみました。 コピーするとosk.exeは実行できましたが、ソースコードで何とかできないかとの思いでしたので、試した後にやはり削除しました。 回答頂き、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問