![]() |
[.NET] Schriftgröße einer anderen Anwendung ändern?
Es geht um das OnScreenKeyboard bei Windows XP und größer (Für die, die das noch nie gesehen haben: Start -> Ausführen: OSK.exe).
Wie man erkennt, kann man das Ding schonmal nicht resizen. Mit folgendem Code hab ich hinbekommen, dass es auf 4/5 der Bildschirmbreite im unteren Drittel angezeigt wird:
Code:
Problem: Wie man nun erkennen kann, sind die Tasten etwas klein Beschriftet.
using System;
using System.Drawing; using System.Diagnostic; using System.IO; using System.Runtime.InteropServices; class Win32 { [DllImport("user32.dll", EntryPoint = "SetWindowPos")] public static extern bool SetWindowPos( int hWnd, // window handle int hWndInsertAfter, // placement-order handle int X, // horizontal position int Y, // vertical position int cx, // width int cy, // height uint uFlags); // window positioning flags public const int HWND_BOTTOM = 0x0001; public const int HWND_TOP = 0x0000; public const int SWP_NOSIZE = 0x0001; public const int SWP_NOMOVE = 0x0002; public const int SWP_NOZORDER = 0x0004; public const int SWP_NOREDRAW = 0x0008; public const int SWP_NOACTIVATE = 0x0010; public const int SWP_FRAMECHANGED = 0x0020; public const int SWP_SHOWWINDOW = 0x0040; public const int SWP_HIDEWINDOW = 0x0080; public const int SWP_NOCOPYBITS = 0x0100; public const int SWP_NOOWNERZORDER = 0x0200; public const int SWP_NOSENDCHANGING = 0x0400; } namespace MyApplication { class OnScreenKeyboard { public static void Show() { Process process = new Process(); process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardError = true; process.StartInfo.CreateNoWindow = true; process.StartInfo.FileName = Environment.GetFolderPath(Environment.SpecialFolder.System); process.StartInfo.FileName += "\\osk.exe"; process.StartInfo.Arguments = ""; process.StartInfo.WorkingDirectory = Environment.GetFolderPathEnvironment.SpecialFolder.LocalApplicationData); process.Start(); // Start Onscreen Keyboard // calculate size: Rectangle screen = System.Windows.Forms.Screen.PrimaryScreen.Bounds; Int32 width = (Int32)Math.Round((Double)(screen.Width / 5 * 4)); Int32 height = (Int32)Math.Round((Double)(screen.Height / 3)); Int32 left = (Int32)Math.Round((Double)(screen.Width / 5 /2)); Int32 top = 2* height; process.WaitForInputIdle(); Win32.SetWindowPos((int)process.MainWindowHandle, Win32.HWND_BOTTOM, left, top, width, height, Win32.SWP_SHOWWINDOW | Win32.SWP_NOZORDER); } } } Ja, das OSK bietet die Möglichkeit die Schriftgröße über das Menü zu ändern, aber ich würde das gerne aus meinem Programm heraus automatisch machen. Jemand eine Idee? |
Re: [.NET] Schriftgröße einer anderen Anwendung ändern?
*push* :duck:
|
Re: [.NET] Schriftgröße einer anderen Anwendung ändern?
Hmm, wenn du sowieso per API das Ding fernsteuerst, könntest du natürlich auch einfach so dreist sein und die Klicks im Menü und im FontDialog simulieren... Da die Fensterchen keine Font-Eigenschaft haben, sondern die Schriftart bei jedem Zeichnen in den DC selektiert wird, kannst du sie nicht ohne weiteres ändern. Eine schnelle Suche in der Registry ergab jedoch HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr entVersion\Installer\UserData\S-1-5-18\Components\1FA53180034D8EF8BEFAEE981B39F7EA als Speicherort für die Schriftart des OSK. Vielleicht kommst du damit weiter.
|
Re: [.NET] Schriftgröße einer anderen Anwendung ändern?
Hrm.. also der Schlüssel ist eigentlich:
HKEY_CURRENT_USER\Software\Microsoft\Osk Blöderweise liegen dort alle Einstellungen (Größe, Position, Schriftart, Schriftgröße, Tastaturformat, Block- oder normale Ansicht etc.) in Binärer Form drin. Und die Zeit, das Format da zu analysieren hab ich nicht. Alternativ nehmen wir die Einstellungen an einem Client vor, exportieren den Key und spielen die .reg - Dateai auf den Clients ein. Aber wenn die dann irgendwann doch mal die Auflösung ändern und die Schriftgröße deswegen angepasst werden müsste ist das halt ein Mordsaufwand (neue Regdatei überall hinpacken..). Das wollte ich eigentlich vermeiden. |
Re: [.NET] Schriftgröße einer anderen Anwendung ändern?
Ich hatte nur mal die Schriftart auf eine sehr untypische gesetzt, die im System sonst nirgends verwendet wird, und danach gesucht, und erst nach Beenden des OSK tauchte sie im von mir genannten Registry-Eintrag auf, daher ging ich davon aus. Kann natürlich auch was völlig anderes sein :)
Ob die Schriftart in deiner Binärrepräsentation eine feste Länge hat? Jedenfalls ist bei mir hinter dem neuen Schriftnamen und einer 0 noch ein Teil des alten Schriftnamens zu lesen... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz