***Задача***: пишется EXE-ник, который запускает проги на новом рабочем столе, это не терминал, а просто новый рабочий стол на той же станции (HWINSTA). Так же нужно переключение между рабочими столами. ***Реализация***: написан EXE-ник (RunApp.exe), который запускает проги на новом рабочем столе. написан EXE-ник (DesktopInit.exe), который подгружает HOOK.DLL и устанавливает ловушку на клавиатуру. написана DLL (HOOK.DLL), в которой реализована процедура "LRESULT CALLBACK KeyboardProc(...". запуск в следующем порядке: Сначала RunApp.exe подгружает HOOK.DLL и устанавливает ловушку на клавиатуру на основном Desktope, Затем RunApp.exe запускает на новом DESKTOP-e процесс DesktopInit.exe, который подгружает HOOK.DLL и устанавливает ловушку на клавиатуру на новом DESKTOPe. Затем RunApp.exe запускает на новом DESKTOPe любые приложения (согласно пареметрам коммандной строки RunApp.exe). Подгружать HOKK.DLL на обоих DESKTOP-ах нужно потому что все процессы при запуске привязаны к одному рабочему столу параметром lpDesktop структуры STARTUPINFO и ловушки срабатывают так же с привязкой к DESKTOP-у. ***ПРОБЛЕМА*** на новом DESKTOPе можно запустить процесс (например notepad.exe) от имени другого пользователя, и при нажатии на клавиатуру все работатет. Нажмем условную комбинацию клавиш и переключемся на основной DESKTOP, А ТУТ ЗАСАДА, если запустить процес от имени другого юзера (на важно Admin или нет) то процес работает пока не нажмешь клавишу на клавиатуре(фокус клавиатуры на этом процессе). как тока нажал — ПРОЦЕСС ВИСНЕТ и все. А процессы запущенные от того же юзера — работают без нариканий, и по той же комбинации можно опять переключится на новый DESKTOP. Если RunApp.exe не запускает ни один процесс на новом Desktope, или запускает процессы на основном рабочем столе, и подгружает HOOK.DLL и устанавливает ловушку на клавиатуру, то на основном (единственном) рабочем столе ничего не виснет, под любым юзером, все красиво отрабатывается. ***ВОПРОС***: почему виснет и как избежать зависания !!! помогите разобраться, плиз. Запуск на новом раб. столе: код RunApp.exe: Код (Text): hWinstaSave = GetProcessWindowStation(); if ( !hWinstaSave ) return bResult; hWinsta = OpenWindowStation(WinSta, false, READ_CONTROL | WRITE_DAC); if ( !hWinsta ) return bResult; if (!SetProcessWindowStation(hWinsta)) return bResult; hDesk = OpenDesktop(Desktop, 0, false, dwAccessFlags); if (hDesk == 0) { hDesk = CreateDesktop(Desktop, NULL, NULL, DF_ALLOWOTHERACCOUNTHOOK, dwAccessFlags, NULL); if (hDesk == 0) return bResult; } if (!SetProcessWindowStation(hWinstaSave)) return bResult; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); TCHAR strTmp[1024]; _sntprintf_s(strTmp, 1023, _tcslen(WinSta) + _tcslen(Desktop) + 1, _T("%s\\%s"), WinSta, Desktop); si.lpDesktop = strTmp; ZeroMemory(&pi, sizeof(pi)); pi.hThread = pi.hProcess = INVALID_HANDLE_VALUE; bResult = CreateProcess(NULL, lpCommandLine, lpp, lpt, bi, NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE, Env, CurDir, &si, &pi); ..... в DLL: Код (Text): HINSTANCE gl_hInst; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; case DLL_PROCESS_ATTACH: gl_hInst=(HINSTANCE)hModule; return TRUE; } Установка ловушки Код (Text): hKeyHook = SetWindowsHookEx(WH_KEYBOARD, &KeyboardProc, gl_hInst, 0); Виснет даже при такой реализации Код (Text): LRESULT CALLBACK KeyboardProc (int code, WPARAM wParam, LPARAM lParam) { return CallNextHookEx(hKeyHook, code, wParam, lParam); }
Это третий форум, всего просмотров больше 100, и ни на одном ни одного ответа, ни совета, ни предложения..... Ну че блин за фигня, проблему то надо как то решить, ну хоть че нить подскажите. плиииз.