2017-02-15 10 views
0

Я сделал этот маленький скрипт .ps1, так как он позволяет мне запускать C# без использования компилятора (по крайней мере, по крайней мере). Я хотел бы переместить «Экранную клавиатуру доступности», которая открывается с cmd /c osk.exe, поскольку я не могу использовать TabTip - клавиатуру с сенсорным экраном на Win8 +.Переместить экранную клавиатуру (osk.exe) с помощью C# и Win API

Как экранная клавиатура не так уж очень как приготовлено клавиатура, я хотел бы хода клавиатуру в нужном месте и изменить его размер. Я заметил, что OSK имеет дочернее окно (OSKMainClassDirectUIHWND), поэтому я пошел даже на это, но не повезло. С другой стороны, один и тот же код для одного окна работает для блокнота и правильно помещает его и изменяет его размеры.

Я положил Process.Start() в if, чтобы он дал некоторую обратную связь, поэтому я вижу, что он нашел дочернее окно - это приятно. BUT, он не двигал его.

Интересная вещь появилась, когда я нажал Alt+Tab и провел Alt - окно OSK появилось как серый полноэкранный (стиль в стиле метро). Я не уверен, что это предназначенное поведение для родительского окна или нет.

Кроме того, я думал, что это будут стили окон, но нет, стили почти одинаковы (кроме двух несвязанных стилей), поэтому я не знаю, как продолжить. Есть идеи?

Код: стили

$CSsource = @" 
using System; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 

namespace Win { 
    public static class API { 
     [DllImport("user32.dll")] 
     static extern IntPtr FindWindow(
      string lpClassName, 
      string lpWindowName 
     ); 

     [DllImport("user32.dll")] 
     public static extern IntPtr FindWindowEx(
      IntPtr parentHwnd, 
      IntPtr childAfter, 
      string className, 
      string windowTitle 
     ); 

     [DllImport("user32.dll")] 
     static extern bool ShowWindow(
      IntPtr hWnd, 
      int nCmdShow 
     ); 

     [DllImport("user32.dll")] 
     static extern bool MoveWindow(
      IntPtr hWnd, 
      int X, int Y, 
      int Width, int Height, 
      bool Repaint 
     ); 

     public static void Move(
      string wClass, string wName, 
      string childClass, 
      int top, int left, 
      int width, int height 
     ) { 
      IntPtr hwnd = FindWindow(wClass, wName); 
      if ((int) hwnd > 0) { 
       IntPtr subHwnd; 
       if (childClass != String.Empty) { 
        subHwnd = FindWindowEx(hwnd, IntPtr.Zero, childClass, null); 
       } else { 
        subHwnd = IntPtr.Zero; 
       } 

       if ((int) subHwnd > 0) { 
        MoveWindow(subHwnd, left, top, width, height + 50, true); 
        Process.Start("cmd"); //feedback from loop, heh 
       } else { 
        MoveWindow(hwnd, left, top, width, height + 50, true); 
       } 
      } 
     } 
    } 
} 
"@ 

add-type -TypeDefinition $CSsource 
#[Win.API]::Move('OSKMainClass', 'On-Screen Keyboard', 'DirectUIHWND', 50, 50, 200, 100) 
#[Win.API]::Move('OSKMainClass', 'Accessibility On-Screen Keyboard', 'DirectUIHWND', 50, 50, 200, 100) 
[Win.API]::Move('OSKMainClass', 'Accessibility On-Screen Keyboard', '', 50, 50, 200, 100) 
[Win.API]::Move('Notepad', 'Untitled - Notepad', '', 50, 50, 200, 100) 

OSK окно:

  • WS_CAPTION
  • WS_VISIBLE
  • стиль WS_CLIPSIBLINGS
  • WS_CLIPCHILDREN
  • WS_SYSMENU
  • WS_THICKFRAME
  • WS_OVERLAPPED
  • WS_MINIMIZEBOX
  • WS_EX_LEFT
  • WS_EX_LTRREADING
  • WS_EX_TOPMOST
  • WS_EX_WINDOWEDGE
  • WS_EX_APPWINDOW
  • WS_EX_LAYERED
  • WS_EX_NOACTIVATE

Блокнот стили окна:

выше +

  • WS_RIGHTSCROLLBAR
  • WS_ACCEPTFILES

ответ

3

OSK имеет в своем манифесте, так что работает на ВЫСО r уровень целостности (немного выше среднего).

Для взаимодействия с ним вам необходимо:

  1. запуска приложения повышенной

или

  1. Помещенный UIAccess = "истина" в манифесте
  2. Подписать. exe (This blog post указывает, что вы можете самостоятельно подписываться во время тестирования)
  3. Поместите файл .exe в папку Program Files

Вы также можете попытаться отключить UAC, чтобы убедиться в отсутствии вашего UIAccess.

+0

Да, это, скорее всего, то, что мне не хватает. Вы пытались запустить скрипт? Я не уверен, что смогу написать и подписать его, поскольку я намереваюсь работать в PowerShell. – KeyWeeUsr

 Смежные вопросы

  • Нет связанных вопросов^_^