2017-02-15 75 views
0

私はこの小さな.ps1スクリプトを作ったので、コンパイラを使わずに(少なくとも直接)C#を実行できます。私は実際にはTabTip - Win8 +でパンのタッチスクリーンキーボードを使用することができないので、cmd /c osk.exeで開く "アクセシビリティオンスクリーンキーボード"を移動したいと思います。C#とWin APIを使って画面キーボード(osk.exe)を移動

オンスクリーンキーボードは本当にきれいにパンキーボードのようではないので、私はしたい場所てサイズを変更する移動キーボードをしたいと思います。私はOSKに子ウィンドウ(OSKMainClassDirectUIHWND)があることに気づきました。一方、同じウィンドウのコードはメモ帳のために働き、正しく配置してサイズを変更します。

私はProcess.Start()をifに入れました。フィードバックが戻ってきたので、子ウィンドウが見つかりました。いいですよ。 BUT、それを動かさなかった。

Alt+Tabを押してAltを押したときに興味深いものが現れました。OSKウィンドウは灰色のフルスクリーンのようなものでした(メトロ様のスタイル)。親ウィンドウの意図した動作かどうかはわかりません。

また、私はそれがウィンドウスタイルのものだと思っていましたが、スタイルはほとんど同じではありません(2つの無関係なスタイルを除いて)。何か案は?

コード:

$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上記

    OSKは、それがhigheで実行そのマニフェストにしたよう

答えて

3

r完全性レベル(培地のわずかに上)。マニフェスト

    1. は、あなたのアプリが上昇RUN

    またはUIAccess = "true" を入れて

    1. サイン:

      が必要にそれと対話します。 exe(This blog postは、テスト中に自己署名できることを示します)
    2. Program Filesフォルダ内のどこかに

    を.exeファイルを入れてまたUIAccessのあなたの不足が問題となっていることを確認するためにUACを無効にしてみてください。

  • +0

    ええ、それは私が行方不明になっている可能性が高いです。スクリプトを実行してみましたか?私はpowershellから実行しようとするとき、私はそれを書いて署名することは本当に確かではありません。 – KeyWeeUsr

    関連する問題