2017-02-15 53 views
0

我已經制作了這個小小的.ps1腳本,因爲它允許我在不使用編譯器(至少直接)的情況下運行C#。我想移動「無障礙屏幕鍵盤」,以cmd /c osk.exe打開,因爲我無法真正使用TabTip - Win8 +上的平移觸摸屏鍵盤。使用C#&Win API移動屏幕鍵盤(osk.exe)

由於屏幕鍵盤是不是真的那麼漂亮像平移的鍵盤,我想移動鍵盤到所需的位置調整其大小。我注意到OSK有一個子窗口(OSKMainClassDirectUIHWND),所以我甚至爲此付出了代價,但沒有運氣。另一方面,單個窗口的相同代碼適用於記事本,並正確放置並調整其大小。

我把Process.Start()納入if,這樣它就給出了一些反饋,所以我看到它找到了子窗口 - 那很好。 但是,它沒有移動它。

當我按下Alt+Tab並保持Alt時,出現了一個有趣的事情 - OSK窗口顯示爲灰色全屏(類似於metro的風格)。我不確定這是否是父窗口的預期行爲。另外,我認爲它會是窗口風格的東西,但不是,風格幾乎相同(除了兩個不相關的風格),所以我沒有任何線索如何繼續。有任何想法嗎?

代碼:

$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已在其清單所以它運行在一個解釋第1條r完整性等級(略高於中等)。

與它進行交互,你需要:

  1. 運行你的應用程序提升
在您的清單
    1. 將UIAccess = 「真」 簽署。 exe(This blog post表示您可以在測試過程中自行簽名)
    2. 把.exe文件的某處Program Files文件夾

    裏面你也可以嘗試禁用UAC來驗證你缺乏UIAccess的是這個問題。

  • +0

    是的,那很可能是我錯過的東西。你有沒有嘗試運行腳本提升?我不確定我是否可以編寫和簽名,因爲我打算從PowerShell中運行。 – KeyWeeUsr