Как запустить программу экранной клавиатуры из унаследованного приложения VB-6 - PullRequest
4 голосов
/ 20 мая 2019

Я пытаюсь «shell osk.exe» из моего приложения VB-6 на компьютере с Windows 10-32 или Windows 10-64.

В прошлом мы просто использовали:

Private Sub Command1_Click()
Dim strTemp As String
Dim fso1 As New FileSystemObject
strTemp = fso1.GetSpecialFolder(SystemFolder) & "\osk.exe"

Dim lngReturn As Long
Let lngReturn = ShellExecute(Me.hwnd, "Open", strTemp, vbNullString, "C:\", SW_SHOWNORMAL)

lblReturn.Caption = CStr(lngReturn)

end sub

Мы также использовали более простую команду 'shell'; ни работа.

И в прошлом это работало нормально. Мы также можем открыть NotePad, msPaint и некоторые другие утилиты из нашей программы. Мы используем промышленный ПК с сенсорным экраном и для удобства разместили несколько кнопок на странице «Настройки» для быстрого доступа к этим типам вспомогательных программ. Я не хочу ждать программы, у нашего кода есть своя «клавиатура с сенсорным экраном». Пользователи будут использовать Windows OSK только тогда, когда они захотят выполнить какую-либо работу вне нашего основного приложения.

Для Windows XP все эти программы открываются нормально. Теперь для Windows 10 не запускается только программа OSK.exe. Глядя на код возврата, возвращается ошибка «Файл 2 не найден» (я полагаю). Но, глядя в папку c: \ windows \ system32, там находится файл 'osk.exe' вместе с mspaint.exe и notepad.exe.

Есть ли какая-то настройка Windows, которая скрывает настоящий osk.exe от моей программы?

Спасибо за любые предложения.

1 Ответ

5 голосов
/ 21 мая 2019

На моей 64-битной Windows 10 ваш код ведет себя так, как вы сказали. Похоже, что в 64-битных окнах вы должны отключить перенаправление WOW 64:

Option Explicit

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, _
    ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, _
    ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Private Const SW_SHOWNORMAL = 1

Private Declare Function Wow64EnableWow64FsRedirection Lib "kernel32.dll" (ByVal Enable As Boolean) As Boolean '// ****Add this****

Private Sub Command1_Click()
    Dim fso1 As New FileSystemObject
    Dim strTemp As String

    strTemp = fso1.GetSpecialFolder(SystemFolder) & "\osk.exe"

    Dim lngReturn As Long
    Wow64EnableWow64FsRedirection False '// ****Add this****
    Let lngReturn = ShellExecute(Me.hwnd, "open", strTemp, vbNullString, "C:\", SW_SHOWNORMAL)
    Wow64EnableWow64FsRedirection True '// ****Add this****
    lblReturn.Caption = CStr(lngReturn)
End Sub

Этот код работает как брелок в Windows 10 64-bit. Также протестирован на Windows 10 32-битный ... там же работает.

...