回答編集履歴

5

追記

2020/03/04 12:13

投稿

YAmaGNZ
YAmaGNZ

スコア10258

test CHANGED
@@ -53,3 +53,109 @@
53
53
  ```
54
54
 
55
55
  これで、AnyCPUで「32ビットを優先」にチェックを入れると32ビットアプリ側、チェックを外すと64ビットアプリ側を通りました。
56
+
57
+
58
+
59
+
60
+
61
+ ### さらに追記
62
+
63
+ 上記回答時にテストしていたPCとは別のPCで確認したところ、質問者さんと同じと思われる状況になりました。
64
+
65
+ Windows10Pro 64bit バージョン1903の環境なのですが、32ビットのコマンドプロンプト(C:\Windows\SysWOW64\cmd.exe)にて下記のようになりました。
66
+
67
+ ```
68
+
69
+
70
+
71
+ c:\>dir c:\windows\sysnative\osk.exe
72
+
73
+ ドライブ C のボリューム ラベルは Windows です
74
+
75
+ ボリューム シリアル番号は XXXX-XXXX です
76
+
77
+
78
+
79
+ c:\windows\sysnative のディレクトリ
80
+
81
+
82
+
83
+ 2019/11/19 15:02 642,560 osk.exe
84
+
85
+ 1 個のファイル 642,560 バイト
86
+
87
+ 0 個のディレクトリ 400,892,551,168 バイトの空き領域
88
+
89
+
90
+
91
+ c:\>c:\windows\sysnative\osk.exe
92
+
93
+ ファイル c:\windows\sysnative\osk.exe が見つかりません。
94
+
95
+
96
+
97
+ ```
98
+
99
+ dirでファイルが見つかるのに実行することが出来ません。
100
+
101
+ なぜ、このような現象になるのかは調べきれませんでした。
102
+
103
+
104
+
105
+ そこで、方向性を変えて、リダイレクトを無効化してみました。
106
+
107
+ ```C#
108
+
109
+ [DllImport("kernel32.dll", SetLastError = true)]
110
+
111
+ static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);
112
+
113
+
114
+
115
+ [DllImport("kernel32.dll", SetLastError = true)]
116
+
117
+ static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);
118
+
119
+
120
+
121
+ private void Button1_Click(object sender, EventArgs e)
122
+
123
+ {
124
+
125
+
126
+
127
+ IntPtr wow64Value = IntPtr.Zero;
128
+
129
+
130
+
131
+ try
132
+
133
+ {
134
+
135
+ // File System Redirectorを無効化する
136
+
137
+ Wow64DisableWow64FsRedirection(ref wow64Value);
138
+
139
+
140
+
141
+ System.Diagnostics.Process.Start(@"C:\Windows\system32\osk.exe");
142
+
143
+
144
+
145
+ }
146
+
147
+ finally
148
+
149
+ {
150
+
151
+ // File System Redirectorを有効化する
152
+
153
+ Wow64RevertWow64FsRedirection(wow64Value);
154
+
155
+ }
156
+
157
+ }
158
+
159
+ ```
160
+
161
+ こちらの方法ですと、質問者さんと同じであろう環境の方でも「32ビットを優先」のチェックに関わらずoskを起動することが出来ました。

4

追記

2020/03/04 12:12

投稿

YAmaGNZ
YAmaGNZ

スコア10258

test CHANGED
@@ -25,3 +25,31 @@
25
25
  追記
26
26
 
27
27
  すみません。x64だとsysnativeでアクセスするとエラーとなりますね。
28
+
29
+
30
+
31
+ ```C#
32
+
33
+ if(Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess)
34
+
35
+ {
36
+
37
+ Console.WriteLine("32ビットアプリ");
38
+
39
+ System.Diagnostics.Process.Start(@"C:\Windows\sysnative\osk.exe");
40
+
41
+ }
42
+
43
+ else
44
+
45
+ {
46
+
47
+ Console.WriteLine("64ビットアプリ");
48
+
49
+ System.Diagnostics.Process.Start(@"C:\Windows\system32\osk.exe");
50
+
51
+ }
52
+
53
+ ```
54
+
55
+ これで、AnyCPUで「32ビットを優先」にチェックを入れると32ビットアプリ側、チェックを外すと64ビットアプリ側を通りました。

3

追記

2020/03/03 08:58

投稿

YAmaGNZ
YAmaGNZ

スコア10258

test CHANGED
@@ -19,3 +19,9 @@
19
19
  >プロパティのその他>StartInfo>FileName からC:\Windows\System32 にあるosk.exeが表示されず選択できない。
20
20
 
21
21
  こちらについても、VisualStudioが32ビットアプリのため、SysWOW64にリダイレクトされている為に表示されない状態となっています。
22
+
23
+
24
+
25
+ 追記
26
+
27
+ すみません。x64だとsysnativeでアクセスするとエラーとなりますね。

2

修正

2020/03/03 08:14

投稿

YAmaGNZ
YAmaGNZ

スコア10258

test CHANGED
@@ -6,7 +6,13 @@
6
6
 
7
7
  このために、64ビット版しか存在しないosk.exeは32ビットアプリから`C:\Windows\System32`にアクセスすると、実際には`C:\Windows\SysWOW64`のファイルを見るのでosk.exeがないということになります。
8
8
 
9
+ ```C#
10
+
11
+ System.Diagnostics.Process.Start(@"C:\Windows\sysnative\osk.exe");
12
+
13
+ ```
14
+
9
- "C:\Windows\sysnative\osk.exe"とすればリダイレクトは関係なくなりますので、32ビットアプリでもosk.exeが起動できるかと思います。
15
+ とすればリダイレクトされずにSystem32フォルダを参照ので、32ビットアプリでもosk.exeが起動できるかと思います。
10
16
 
11
17
 
12
18
 

1

修正

2020/03/03 08:09

投稿

YAmaGNZ
YAmaGNZ

スコア10258

test CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
 
4
4
 
5
- 32ビットアプリですとC:\Windows\System32はC:\Windows\SysWOW64にリダイレクトされます。
5
+ 32ビットアプリですと`C:\Windows\System32``C:\Windows\SysWOW64`にリダイレクトされます。
6
6
 
7
- このために、64ビット版しか存在しないosk.exeは32ビットアプリからC:\Windows\System32にアクセスすると、実際にはC:\Windows\SysWOW64のファイルを見るのでosk.exeがないということになります。
7
+ このために、64ビット版しか存在しないosk.exeは32ビットアプリから`C:\Windows\System32`にアクセスすると、実際には`C:\Windows\SysWOW64`のファイルを見るのでosk.exeがないということになります。
8
8
 
9
9
  "C:\Windows\sysnative\osk.exe"とすればリダイレクトは関係なくなりますので、32ビットアプリでもosk.exeが起動できるかと思います。
10
10