2016-11-03 6 views
0

Я разработал фрагмент кода C#, чтобы определить, показывала ли виртуальная (экранная) клавиатура или нет.C# Проблемы с виртуальной клавиатурой Windows 10

ниже код работает отлично в Windows 7, 8 и 8.1, но в Windows 10, то IsKeyboardVisible всегда возвращает true ...

public static bool IsKeyboardVisible() { 
    Process keyboardProc; 
    UInt32 WS_DISABLED = 0x8000000; 
    UInt32 WS_VISIBLE = 0X94000000; 
    int GWL_STYLE = -16; 
    IntPtr keyboardHandle = GetKeyboardWindowHandle(); 

    bool visible = false; 

    if (keyboardHandle != IntPtr.Zero) { 
     UInt32 style = GetWindowLong(keyboardHandle, GWL_STYLE); 
     // in Win10, this always returns "true", i.e. WS_DISABLED is 
     // 
     //visible = ((style & WS_DISABLED) != WS_DISABLED); 
     // UPDATE: I found this code helping here 
     visible = (style == WS_VISIBLE); 
    } 
    return visible; 
} 

Я использовал учебник по SO, но некоторое время назад так жаль, что не зачислил автора.

Кто-нибудь знает о фрагменте рабочего кода для всех последних версий Windows, поэтому мне не нужно проверять фактическую ОС для включения версии ...?

UPDATE

Я нашел original post here, что позволило мне исправить код. Так что теперь моя проблема та же самая старая Win10 проблема - я не могу показать виртуальную клавиатуру с помощью

string progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink"; 
string keyboardPath = Path.Combine(progFiles, "TabTip.exe"); 
keyboardProc = Process.Start(keyboardPath); 

... Опять же, есть ли «все-платформа» код, который я могу использовать, или что предлагаемое подход для Win10?

UPDATE 2 Я узнал о проблемах с 32-разрядным приложением на 64-разрядной ОС. При этом, этой ошибке возникает попробовать ли я запустить osk.exe в System32 или «папке sysWOW64` ... Есть ли другой способ, чем сделать 64-битную выпустить ???

ответ

0

После долгого рытья о TabTip.exe, . osk.exe и x86 и x64 проблемы совместимости, я нашел решение путем поиска osk.exe на моей системе и пытается запустить каждый из них я нашел 4 версии следующие папки:

  • C:\Windows\System32
  • C:\Windows\SysWOW64
  • C:\Windows\WinSxS\amd64_microsoft...
  • C:\Windows\WinSxS\wow64_microsoft...

Он появляется один в C:\Windows\WinSxS\amd64_microsoft... работает отлично (не другие три, хотя) ...

Учитывая "amd64 _...." папка не может быть одинаковым разные машины (я действительно проверял, и они не совпадают, я не искал, зависит ли это от машины, сборки окон или чего-то еще ...).

Так что в основном я сделал небольшую рутину для поиска в папке WinSxS и возвращении самого первого появления osk.exe, который работает просто отлично. Я также сделал код работает на 32-битных ОС, используя простой тест OS-архитектуры:

string OSKpath64 = getOskPath(@"C:\Windows\WinSxS"); 
if (string.IsNullOrWhiteSpace(OSKpath64)) { 
    OSKpath64 = "osk.exe"; 
    } 
    string OSKpath32 = @"C:\Windows\System32\osk.exe"; 
    if (!File.Exists(OSKpath32)) { 
     OSKpath32 = @"osk.exe"; 
    } 
    System.Diagnostics.Process.Start((Environment.Is64BitOperatingSystem) ? OSKpath64 : OSKpath32); 

UPDATE: Путаница с одной рабочей и одной неработающего версии в папке WinSxS меня нервная , Он отлично работает, потому что папка amd_.. находится в алфавитном порядке до wow64_....

Поэтому я предлагаю добавить тест в метод getOskPath, чтобы вернуть первый родной 64-разрядный osk.exe (а не эмулируемый).

Использование IsWin64Emulatormethod found here, метод выглядит следующим образом:

static string getOskPath(string dir) { 
    string path = Path.Combine(dir, "osk.exe"); 
    if (File.Exists(path)) { 
     Process p = System.Diagnostics.Process.Start(path); 
     if (p.IsWin64Emulator()) { 
      path = string.Empty; 
     } 
     p.Kill(); 
     return path; 
    } 
    DirectoryInfo di = new DirectoryInfo(dir); 
    foreach (DirectoryInfo subDir in di.GetDirectories().Reverse()) { 
     path = getOskPath(Path.Combine(dir, subDir.Name)); 
     if (!string.IsNullOrWhiteSpace(path)) { 
      return path; 
     } 
    } 
    return string.Empty; 
} 
Смежные вопросы