我已經制作了這個小小的.ps1
腳本,因爲它允許我在不使用編譯器(至少直接)的情況下運行C#。我想移動「無障礙屏幕鍵盤」,以cmd /c osk.exe
打開,因爲我無法真正使用TabTip
- Win8 +上的平移觸摸屏鍵盤。使用C#&Win API移動屏幕鍵盤(osk.exe)
由於屏幕鍵盤是不是真的那麼漂亮像平移的鍵盤,我想移動鍵盤到所需的位置和調整其大小。我注意到OSK有一個子窗口(OSKMainClass
→DirectUIHWND
),所以我甚至爲此付出了代價,但沒有運氣。另一方面,單個窗口的相同代碼適用於記事本,並正確放置並調整其大小。
我把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
是的,那很可能是我錯過的東西。你有沒有嘗試運行腳本提升?我不確定我是否可以編寫和簽名,因爲我打算從PowerShell中運行。 – KeyWeeUsr