Я сделал этот маленький скрипт .ps1
, так как он позволяет мне запускать C# без использования компилятора (по крайней мере, по крайней мере). Я хотел бы переместить «Экранную клавиатуру доступности», которая открывается с cmd /c osk.exe
, поскольку я не могу использовать TabTip
- клавиатуру с сенсорным экраном на Win8 +.Переместить экранную клавиатуру (osk.exe) с помощью C# и Win API
Как экранная клавиатура не так уж очень как приготовлено клавиатура, я хотел бы хода клавиатуру в нужном месте и изменить его размер. Я заметил, что OSK имеет дочернее окно (OSKMainClass
→ DirectUIHWND
), поэтому я пошел даже на это, но не повезло. С другой стороны, один и тот же код для одного окна работает для блокнота и правильно помещает его и изменяет его размеры.
Я положил 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
Да, это, скорее всего, то, что мне не хватает. Вы пытались запустить скрипт? Я не уверен, что смогу написать и подписать его, поскольку я намереваюсь работать в PowerShell. – KeyWeeUsr