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

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

ただいまの
回答率

88.59%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,442

m_rase

score 7

前提・実現したいこと

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

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

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

該当のソースコード

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

試したこと

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

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

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

4)

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


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

5)

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


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

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

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

Windows10 64bit
VisualStudio2019

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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

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


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

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

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

if(Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess)
{
    Console.WriteLine("32ビットアプリ");
    System.Diagnostics.Process.Start(@"C:\Windows\sysnative\osk.exe");
}
else
{
    Console.WriteLine("64ビットアプリ");
    System.Diagnostics.Process.Start(@"C:\Windows\system32\osk.exe");
}


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

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

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);

private void Button1_Click(object sender, EventArgs e)
{

    IntPtr wow64Value = IntPtr.Zero;

    try
    {
        // File System Redirectorを無効化する
        Wow64DisableWow64FsRedirection(ref wow64Value);

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

    }
    finally
    {
        // File System Redirectorを有効化する
        Wow64RevertWow64FsRedirection(wow64Value);
    }
}


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/04 05:43

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

    キャンセル

  • 2020/03/04 09:19

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

    キャンセル

  • 2020/03/04 22:33

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

    キャンセル

0

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

イメージ説明

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

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/03 17:32

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

    キャンセル

  • 2020/03/04 09:12

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

    キャンセル

  • 2020/03/04 22:33

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

    キャンセル

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

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る