質問するログイン新規登録

回答編集履歴

5

追記

2020/03/04 12:13

投稿

YAmaGNZ
YAmaGNZ

スコア10688

answer CHANGED
@@ -25,4 +25,57 @@
25
25
  System.Diagnostics.Process.Start(@"C:\Windows\system32\osk.exe");
26
26
  }
27
27
  ```
28
- これで、AnyCPUで「32ビットを優先」にチェックを入れると32ビットアプリ側、チェックを外すと64ビットアプリ側を通りました。
28
+ これで、AnyCPUで「32ビットを優先」にチェックを入れると32ビットアプリ側、チェックを外すと64ビットアプリ側を通りました。
29
+
30
+
31
+ ### さらに追記
32
+ 上記回答時にテストしていたPCとは別のPCで確認したところ、質問者さんと同じと思われる状況になりました。
33
+ Windows10Pro 64bit バージョン1903の環境なのですが、32ビットのコマンドプロンプト(C:\Windows\SysWOW64\cmd.exe)にて下記のようになりました。
34
+ ```
35
+
36
+ c:\>dir c:\windows\sysnative\osk.exe
37
+ ドライブ C のボリューム ラベルは Windows です
38
+ ボリューム シリアル番号は XXXX-XXXX です
39
+
40
+ c:\windows\sysnative のディレクトリ
41
+
42
+ 2019/11/19 15:02 642,560 osk.exe
43
+ 1 個のファイル 642,560 バイト
44
+ 0 個のディレクトリ 400,892,551,168 バイトの空き領域
45
+
46
+ c:\>c:\windows\sysnative\osk.exe
47
+ ファイル c:\windows\sysnative\osk.exe が見つかりません。
48
+
49
+ ```
50
+ dirでファイルが見つかるのに実行することが出来ません。
51
+ なぜ、このような現象になるのかは調べきれませんでした。
52
+
53
+ そこで、方向性を変えて、リダイレクトを無効化してみました。
54
+ ```C#
55
+ [DllImport("kernel32.dll", SetLastError = true)]
56
+ static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);
57
+
58
+ [DllImport("kernel32.dll", SetLastError = true)]
59
+ static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);
60
+
61
+ private void Button1_Click(object sender, EventArgs e)
62
+ {
63
+
64
+ IntPtr wow64Value = IntPtr.Zero;
65
+
66
+ try
67
+ {
68
+ // File System Redirectorを無効化する
69
+ Wow64DisableWow64FsRedirection(ref wow64Value);
70
+
71
+ System.Diagnostics.Process.Start(@"C:\Windows\system32\osk.exe");
72
+
73
+ }
74
+ finally
75
+ {
76
+ // File System Redirectorを有効化する
77
+ Wow64RevertWow64FsRedirection(wow64Value);
78
+ }
79
+ }
80
+ ```
81
+ こちらの方法ですと、質問者さんと同じであろう環境の方でも「32ビットを優先」のチェックに関わらずoskを起動することが出来ました。

4

追記

2020/03/04 12:12

投稿

YAmaGNZ
YAmaGNZ

スコア10688

answer CHANGED
@@ -11,4 +11,18 @@
11
11
  こちらについても、VisualStudioが32ビットアプリのため、SysWOW64にリダイレクトされている為に表示されない状態となっています。
12
12
 
13
13
  追記
14
- すみません。x64だとsysnativeでアクセスするとエラーとなりますね。
14
+ すみません。x64だとsysnativeでアクセスするとエラーとなりますね。
15
+
16
+ ```C#
17
+ if(Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess)
18
+ {
19
+ Console.WriteLine("32ビットアプリ");
20
+ System.Diagnostics.Process.Start(@"C:\Windows\sysnative\osk.exe");
21
+ }
22
+ else
23
+ {
24
+ Console.WriteLine("64ビットアプリ");
25
+ System.Diagnostics.Process.Start(@"C:\Windows\system32\osk.exe");
26
+ }
27
+ ```
28
+ これで、AnyCPUで「32ビットを優先」にチェックを入れると32ビットアプリ側、チェックを外すと64ビットアプリ側を通りました。

3

追記

2020/03/03 08:58

投稿

YAmaGNZ
YAmaGNZ

スコア10688

answer CHANGED
@@ -8,4 +8,7 @@
8
8
  とすればリダイレクトされずにSystem32フォルダを参照するので、32ビットアプリでもosk.exeが起動できるかと思います。
9
9
 
10
10
  >プロパティのその他>StartInfo>FileName からC:\Windows\System32 にあるosk.exeが表示されず選択できない。
11
- こちらについても、VisualStudioが32ビットアプリのため、SysWOW64にリダイレクトされている為に表示されない状態となっています。
11
+ こちらについても、VisualStudioが32ビットアプリのため、SysWOW64にリダイレクトされている為に表示されない状態となっています。
12
+
13
+ 追記
14
+ すみません。x64だとsysnativeでアクセスするとエラーとなりますね。

2

修正

2020/03/03 08:14

投稿

YAmaGNZ
YAmaGNZ

スコア10688

answer CHANGED
@@ -2,7 +2,10 @@
2
2
 
3
3
  32ビットアプリですと`C:\Windows\System32`は`C:\Windows\SysWOW64`にリダイレクトされます。
4
4
  このために、64ビット版しか存在しないosk.exeは32ビットアプリから`C:\Windows\System32`にアクセスすると、実際には`C:\Windows\SysWOW64`のファイルを見るのでosk.exeがないということになります。
5
+ ```C#
6
+ System.Diagnostics.Process.Start(@"C:\Windows\sysnative\osk.exe");
7
+ ```
5
- "C:\Windows\sysnative\osk.exe"とすればリダイレクトは関係なくなりますので、32ビットアプリでもosk.exeが起動できるかと思います。
8
+ とすればリダイレクトされずにSystem32フォルダを参照ので、32ビットアプリでもosk.exeが起動できるかと思います。
6
9
 
7
10
  >プロパティのその他>StartInfo>FileName からC:\Windows\System32 にあるosk.exeが表示されず選択できない。
8
11
  こちらについても、VisualStudioが32ビットアプリのため、SysWOW64にリダイレクトされている為に表示されない状態となっています。

1

修正

2020/03/03 08:09

投稿

YAmaGNZ
YAmaGNZ

スコア10688

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  アプリケーションをx86で作成していませんか?
2
2
 
3
- 32ビットアプリですとC:\Windows\System32はC:\Windows\SysWOW64にリダイレクトされます。
3
+ 32ビットアプリですと`C:\Windows\System32``C:\Windows\SysWOW64`にリダイレクトされます。
4
- このために、64ビット版しか存在しないosk.exeは32ビットアプリからC:\Windows\System32にアクセスすると、実際にはC:\Windows\SysWOW64のファイルを見るのでosk.exeがないということになります。
4
+ このために、64ビット版しか存在しないosk.exeは32ビットアプリから`C:\Windows\System32`にアクセスすると、実際には`C:\Windows\SysWOW64`のファイルを見るのでosk.exeがないということになります。
5
5
  "C:\Windows\sysnative\osk.exe"とすればリダイレクトは関係なくなりますので、32ビットアプリでもosk.exeが起動できるかと思います。
6
6
 
7
7
  >プロパティのその他>StartInfo>FileName からC:\Windows\System32 にあるosk.exeが表示されず選択できない。