Anderson,
Pelo que pude perceber, uma proposta do seu programa é não permitir o usuário abrir programas simultaneamente.
Como sou programador e já passei por esses tipos de problemas, eu uso o seguinte código para criar um segundo desktop impossibilitando de o usuário acessar os programas.
HDESK hOriginalThread;
HDESK hOriginalInput;
HDESK hNewDesktop;
// Save original ...
hOriginalThread = GetThreadDesktop(GetCurrentThreadId());
hOriginalInput = OpenInputDesktop(0, FALSE, DESKTOP_SWITCHDESKT OP);
// Create a new Desktop and switch to it
hNewDesktop = CreateDesktop("NEWDESKTOP", NULL, NULL, 0, GENERIC_ALL, NULL);
SetThreadDesktop(hNewDesktop);
SwitchDesktop(hNewDesktop);
...
// Restore original ...
SwitchDesktop(hOriginalInput);
SetThreadDesktop(hOriginalThread);
// Close the Desktop
CloseDesktop(hNewDesktop);
Essa foi uma ótima solução que encontrei para resolver esses tipos de problemas.
Uma dica, é travar o acesso ao Gerenciador de dispositivos enquanto seu programa estiver sendo executado.
Espero que lhe seje útil.
Abraços,
Cláudio S. Freund