lunedì 4 marzo 2019

W10 - HIGH DPI SCALING FIX BLURRY APPS

On W10 due to high resolution screens, often the user set the screen scaling to better read the texts and icons, for example to 150%

After that, it happens that some app's text appears to be blurry, out of focus.

You can fix this in 3 places:
1. control panel, apply to the system
2. single app
3. registry

1- Using Control Panel, apply to the System
start menu, settings, system, display, here you have "Scale and layout " set for example to "150%",
click the link "Advanced Scaling Settings" and activate the option "Let Windows try to fix apps so they're not blurry"

2-single app
navigate to the executable file of the app (just as an example: c:\program file\blurryapp\blurry.exe" )
right click on the .exe file
"compatibility" tab
"change settings for all users" (if this is what you want)
"change high DPI settings"
select "Override high DPI scaling behavior." option
and then select "Application" in Scaling performed by

3. registry (this is useful for control panel apps , dll run by RUNDLL32.exe and similar)
When the blurry app does not have an executable (like the apps in the control panel for example) you can use the registry.
An example is Microsoft System Configuration Manager. It's window is blurry when scaling is activated.
Proceed like this:

regedit
create this key:

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]

then create a STRING value, where the name is the executable path and the value is "HIGHDPIAWARE"

in the RUNDLL32.exe case it's like this (you can copy and paste this into a .reg file, double click it to insert in the registry)

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"C:\\Windows\\System32\\rundll32.exe"="HIGHDPIAWARE"

Once the setting is in the registry, simply close and reopen the app and it will be ok, no reboot is needed.

I used HKLM because is the simplest one, it applies to all user profiles of the machine, already existing and new one when they will be created




lunedì 21 gennaio 2019

Windows change keyboard layout in remote desktop always revert to default (eng)

Hi,
if you are experiencing Windows (2016 server in my case) in remote desktop to automatically change the Keyboard Layout to the default (ENG) one, whatever you set , you are in the right place.

In the last days I fought against my Windows 2016 server. I set the keyboard layout to ITA but without apparent reason it automatically revert to ENG anytime .

I tried in many way to fix it, but it always reverted to ENG, also if in the control panel I deleted any keyboard layout and left just the one I wanted.

Solution:

open regedit, navigate here (be careful! Layout  - NOT Layouts )

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout

create this :

 IgnoreRemoteKeyboardLayout   DWORD   1

logout/login (or reboot the machine), the keyboard layout should be now the one selected from you, if the layout is not set to the correct one, set it , then it should not change anymore.


martedì 15 gennaio 2019

VmWare player / workstation bridged nic does not get IP Address and Virtualbox error : VERR_INTNET_FLT_IF_NOT_FOUND

On a pc where I was able to run virtualbox and vmware player using a bridged NIC , from one point in time on I was not able anymore to make them work.

I tried many of the solutions found in internet but noone was helping me.

In the end what did the job was to uninstall the nic drivers and install the windows default version like this:

1- windows device manager
2- find the NIC you are trying to use with virtualbox
3- check the driver version, maybe you need this in a later step
4- be sure to have somewhere this or other drivers version for this nic in case windows does not have any driver for it and you want to revert to the actual situation
5- uninstall it (and flag the "delete the driver software for this device" also)
6- run "scan for hardware changes"

If you are lucky, windows will detect the nic and install the windows default drivers for it, and in my case this solved the issue, probably the updated drivers I was using (from the vendor) was not compatible with virtualbox.

If you are not lucky, the nic will be detected but drivers not installed, in this case you should try to install a driver different from the one find in the point 3, maybe something older or something newer.
If you don't have any different version, in the worst case, you'll reinstall the same drivers in point 3 but probably you'll not solve your issue, but at least you'll be able to use your network like before, not from the virtual machine, sorry.

venerdì 19 ottobre 2018

I want to know the PATH of an EXE


Never happened that you run an exe from command prompt and you are not sure from what path it's run? sometimes this make the difference. Maybe you have multiple version of an exe, in multiple path or something like that, it's not working like expected and you want to be sure the correct one is run.

If the executable is gui application this is not really an issue, you can obtain the info from the task manager adding for example the "cmd" column, but if the executable is a command line one, that start and end in milliseconds, than you are in trouble.

One clue come from the command "where.exe":

where executablename

will give you all the path where that executable can be find.
But this will not tell you from which path it is run when you digit:

executablename

from a random folder from command prompt

As I'm not aware of any other way to know the path where it is run from , I wrote a very small console application in C# that simply run the process and print the process filename:

si = new ProcessStartInfo(args);
using (Process pr = Process.Start(si))
{
  Console.WriteLine("*****************************************************");
  Console.WriteLine(pr.MainModule.FileName);
  Console.WriteLine("*****************************************************");
}

this does exactly what I need.

For example running my app from a random folder against "dism.exe" I see this:

C:\it>exepath dism
*****************************************************
C:\Windows\System32\Dism.exe
*****************************************************

venerdì 7 settembre 2018

Vsphere VCENTER Server virtual appliance installation Stuck at 80% (and/or RPM installation failed)

I tried to install an old ISO image of the Vcenter virtual appliance from the 2017 and I discovered it was not installable anymore.

The installation progress stuck at 80% and in the end it failed with RPM installation failed.

Reading around it seems a bug in the image itself, the setup process cannot change the root password and so cannot continue and it fails.

Solution (in my case) :

Simply download the latest VCSA .ISO from VmWare site
(I just installed this succesfully: VMware-VCSA-all-6.5.0-7119157.iso )

NOTE: also this version seems to stuck at 80%, it will take a long time to move from 80% but in the end it will be able to pass it and finish the installation

Digger

Vsphere 6.5 setup from USB Key - "Not a COM32R image" error

To install VSphere 6.5 Hypervisor from a bootable USB key let's proceed like this:

1. from VmWare download the ISO file
2. download RUFUS
3. start it
4. open the ISO file form poin 1
5. be sure to set RUFUS with:

- MBR for BIOS or UEFI computers
- FAT32
- cluster size 4096 (default)
- quick format (default)
- create bootable disk using iso (default)
- create extended label and icon (default)

6. insert the USB key in the server and start it , set it to boot from USB or press the boot menu key
7. if you get the error message "Not a COM32R image" then press TAB key, you will see a suggestion like "install hddboot", well...
8. digit the command suggested install hddboot and press Return

The installation begin

martedì 15 maggio 2018

START SCHEDULED TASK (ALMOST) HIDDEN

I was working o a server with a lot of applications and script continuously run from task scheduler and interacting with the desktop with their windows and console windows.
The server admin want them to be visible for checking reason.

But this way it was very annoying to work on that server because continuously interrupted by application or script started that took the focus and stay ahead of my job.

The best (not perfect) way I found to mitigate this is to use powershell to run the applications or script minimized and without taking focus.

In addition, as powershell itself open his console I had to find a workaround for this

Here my solution:

- create personal powershell module with function Start-ProcessNoFocus
- create folder c:\psmodules for my personal powershell modules
- changed environment variable to add c:\psmodules
- put my powershell module in c:\psmodules
- created scheduled task that run simply "powershell"
- run the scheduled task , a powershell window appeared, in properties, layout, window position I set the Y position of the window to be 800, on my monitor this moved the windows near out of the botton margin of the screen
- closed powershell window
- changed task scheduler to run my application like this:

program:              powershell
add argument:      -windowstyle hidden Start-ProcessNoFocus c:\test\MyApplication.exe

The result is :
- a powershell window appears and disappears very quickly
- it starts the process "MyApplication.exe" minimized and without taking focus

it's not perfect but now I'm able to work on the server without being continuously interrupted by all those annoying scheduled tasks.


This it the Start-ProcessNoFocus function that I put in a Start-ProcessNoFocus module :

(credits: # http://www.daveamenta.com/2013-08/powershell-start-process-without-taking-focus/)

function Start-ProcessNoFocus($FilePath, $Arguments) {
Add-Type -TypeDefinition @"
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
 
[StructLayout(LayoutKind.Sequential)]
public struct PROCESS_INFORMATION {
    public IntPtr hProcess;
    public IntPtr hThread;
    public uint dwProcessId;
    public uint dwThreadId;
}
 
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct STARTUPINFO {
    public uint cb;
    public string lpReserved;
    public string lpDesktop;
    public string lpTitle;
    public uint dwX;
    public uint dwY;
    public uint dwXSize;
    public uint dwYSize;
    public uint dwXCountChars;
    public uint dwYCountChars;
    public uint dwFillAttribute;
    public STARTF dwFlags;
    public ShowWindow wShowWindow;
    public short cbReserved2;
    public IntPtr lpReserved2;
    public IntPtr hStdInput;
    public IntPtr hStdOutput;
    public IntPtr hStdError;
}
 
[StructLayout(LayoutKind.Sequential)]
public struct SECURITY_ATTRIBUTES {
    public int length;
    public IntPtr lpSecurityDescriptor;
    public bool bInheritHandle;
}
 
[Flags]
public enum CreationFlags : int {
    NONE = 0,
    DEBUG_PROCESS = 0x00000001,
    DEBUG_ONLY_THIS_PROCESS = 0x00000002,
    CREATE_SUSPENDED = 0x00000004,
    DETACHED_PROCESS = 0x00000008,
    CREATE_NEW_CONSOLE = 0x00000010,
    CREATE_NEW_PROCESS_GROUP = 0x00000200,
    CREATE_UNICODE_ENVIRONMENT = 0x00000400,
    CREATE_SEPARATE_WOW_VDM = 0x00000800,
    CREATE_SHARED_WOW_VDM = 0x00001000,
    CREATE_PROTECTED_PROCESS = 0x00040000,
    EXTENDED_STARTUPINFO_PRESENT = 0x00080000,
    CREATE_BREAKAWAY_FROM_JOB = 0x01000000,
    CREATE_PRESERVE_CODE_AUTHZ_LEVEL = 0x02000000,
    CREATE_DEFAULT_ERROR_MODE = 0x04000000,
    CREATE_NO_WINDOW = 0x08000000,
}
 
[Flags]
public enum STARTF : uint {
    STARTF_USESHOWWINDOW = 0x00000001,
    STARTF_USESIZE = 0x00000002,
    STARTF_USEPOSITION = 0x00000004,
    STARTF_USECOUNTCHARS = 0x00000008,
    STARTF_USEFILLATTRIBUTE = 0x00000010,
    STARTF_RUNFULLSCREEN = 0x00000020,  // ignored for non-x86 platforms
    STARTF_FORCEONFEEDBACK = 0x00000040,
    STARTF_FORCEOFFFEEDBACK = 0x00000080,
    STARTF_USESTDHANDLES = 0x00000100,
}
 
public enum ShowWindow : short {
    SW_HIDE = 0,
    SW_SHOWNORMAL = 1,
    SW_NORMAL = 1,
    SW_SHOWMINIMIZED = 2,
    SW_SHOWMAXIMIZED = 3,
    SW_MAXIMIZE = 3,
    SW_SHOWNOACTIVATE = 4,
    SW_SHOW = 5,
    SW_MINIMIZE = 6,
    SW_SHOWMINNOACTIVE = 7,
    SW_SHOWNA = 8,
    SW_RESTORE = 9,
    SW_SHOWDEFAULT = 10,
    SW_FORCEMINIMIZE = 11,
    SW_MAX = 11
}
 
public static class Kernel32 {
    [DllImport("kernel32.dll", SetLastError=true)]
    public static extern bool CreateProcess(
        string lpApplicationName, 
        string lpCommandLine, 
        ref SECURITY_ATTRIBUTES lpProcessAttributes, 
        ref SECURITY_ATTRIBUTES lpThreadAttributes,
        bool bInheritHandles, 
        CreationFlags dwCreationFlags, 
        IntPtr lpEnvironment,
        string lpCurrentDirectory, 
        ref STARTUPINFO lpStartupInfo, 
        out PROCESS_INFORMATION lpProcessInformation);
}
"@
 
    $si = New-Object STARTUPINFO
    $pi = New-Object PROCESS_INFORMATION
 
    $si.cb = [System.Runtime.InteropServices.Marshal]::SizeOf($si)
#    $si.wShowWindow = [ShowWindow]::SW_SHOWNOACTIVATE

# mia versione 4+2 ovvero non prendere il focus e starta in minimized
    $si.wShowWindow = 6
    $si.dwFlags = [STARTF]::STARTF_USESHOWWINDOW
 
    $pSec = New-Object SECURITY_ATTRIBUTES
    $tSec = New-Object SECURITY_ATTRIBUTES
    $pSec.Length = [System.Runtime.InteropServices.Marshal]::SizeOf($pSec)
    $tSec.Length = [System.Runtime.InteropServices.Marshal]::SizeOf($tSec)
 
    [Kernel32]::CreateProcess($FilePath, $Arguments, [ref] $pSec, [ref] $tSec, $false, [CreationFlags]::CREATE_NEW_CONSOLE, [IntPtr]::Zero, (pwd | select -exp Path), [ref] $si, [ref] $pi)
 
    #[System.Runtime.InteropServices.Marshal]::GetLastWin32Error()
}