Hyper-V is used by Visual Studio to run the Windows Phone emulators. Hyper-V is also incompatible with VMware because Hyper-V starts Windows in a mode of permanent virtualisation while VMware would need VT-x as well during runtime only.
Hyper-V can be installed and uninstalled as a Windows role. This will also activate and deactivate permanent Windows virtualisation and allow VMware to run. But then of course the Visual Studio emulators stop working.
Hyper-V can be configured to be active or inactive without uninstalling the Windows role. This involves editing the boot configuration with bcdedit.exe. After doing this change, a restart is required to actually apply the configuration and use or not use Hyper-V. This BCD setting can be read after setting it, but it is unknown whether the system has already been restarted to actually apply it. So this setting only indicates what will happen after a restart, not whether virtualisation is currently running.
Some people say you could look at the Windows service "vmms". Unfortunately this is not helpful because that service is installed with the Hyper-V role and it is always running, no matter whether virtualisation is really active or not. WMI information is also not helpful because it always says that Hyper-V would be running, even when it's not.
Obviously there must be a way to determine the real current status of virtualisation because VMware will tell you when you try to start a 64 bit machine.
So how can this be done in code? Specifically from a .NET application? Administrator privileges are available for this already because bcdedit.exe also needs it.
Should this require native assembler code, would it be possible to run it from C#/.NET somehow?
Update:
I've made a simple tool that puts a one-click GUI over the bcdedit procedure: Hyper-V Switch. You can try it and see for yourself whether you find any reliable indicator of Hyper-V actually being executed right now, not just being configured to run on next boot. Enable or disable Hyper-V but keep an application open that prevents the reboot. Then Hyper-V Switch will tell you the configured state, not the actual state.
Eventually I'd like to incorporate this status test into the application so that everybody can use it.