void wm_listener::WindowThreadRoutine(const Event* ReadyEvent) { WNDCLASSEX wc={sizeof(wc)}; wc.lpfnWndProc = WndProc; wc.lpszClassName = L"FarHiddenWindowClass"; UnregisterClass(wc.lpszClassName, 0); if(RegisterClassEx(&wc)) { m_Hwnd = CreateWindowEx(0, wc.lpszClassName, nullptr, 0, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, nullptr, nullptr, nullptr, nullptr); ReadyEvent->Set(); if(m_Hwnd) { // for PBT_POWERSETTINGCHANGE HPOWERNOTIFY hpn=Imports().RegisterPowerSettingNotification(m_Hwnd,&GUID_BATTERY_PERCENTAGE_REMAINING,DEVICE_NOTIFY_WINDOW_HANDLE); MSG Msg; while(!m_exitEvent.Signaled() && GetMessage(&Msg, nullptr, 0, 0) > 0) { TranslateMessage(&Msg); DispatchMessage(&Msg); } if (hpn) // for PBT_POWERSETTINGCHANGE Imports().UnregisterPowerSettingNotification(hpn); } UnregisterClass(wc.lpszClassName, 0); } }
virtual bool GetKeyboardLayoutName(string &strName) const override { bool Result=false; wchar_t Buffer[KL_NAMELENGTH]; if (Imports().GetConsoleKeyboardLayoutNameW(Buffer)) { Result=true; strName = Buffer; } else { strName.clear(); } return Result; }
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam) { auto pi = reinterpret_cast<ProcInfo*>(lParam); auto ProcList=pi->procList; if (IsWindowVisible(hwnd) || (IsIconic(hwnd) && !(GetWindowLongPtr(hwnd,GWL_STYLE) & WS_DISABLED))) { DWORD ProcID; GetWindowThreadProcessId(hwnd,&ProcID); string strTitle; int LenTitle=GetWindowTextLength(hwnd); if (LenTitle) { if (pi->bShowImage) { HANDLE hProc = OpenProcess(Imports().QueryFullProcessImageNameW? PROCESS_QUERY_LIMITED_INFORMATION : PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, false, ProcID); if (hProc) { os::GetModuleFileNameEx(hProc, nullptr, strTitle); CloseHandle(hProc); } } else { wchar_t_ptr Title(LenTitle + 1); if (Title) { if ((LenTitle=GetWindowText(hwnd, Title.get(), LenTitle+1))) Title[LenTitle]=0; else Title[0]=0; strTitle=Title.get(); } } } if (!strTitle.empty()) { ProcList->SetUserData(&hwnd,sizeof(hwnd),ProcList->AddItem(FormatString()<<fmt::MinWidth(PID_LENGTH)<<ProcID<< L' ' << BoxSymbols[BS_V1]<< L' ' << strTitle)); } } return TRUE; }
int OperationFailed(const string& Object, LNGID Title, const string& Description, bool AllowSkip) { std::vector<string> Msg; IFileIsInUse *pfiu = nullptr; LNGID Reason = MObjectLockedReasonOpened; bool SwitchBtn = false, CloseBtn = false; DWORD Error = Global->CaughtError(); if(Error == ERROR_ACCESS_DENIED || Error == ERROR_SHARING_VIOLATION || Error == ERROR_LOCK_VIOLATION || Error == ERROR_DRIVE_LOCKED) { string FullName; ConvertNameToFull(Object, FullName); pfiu = CreateIFileIsInUse(FullName); if (pfiu) { FILE_USAGE_TYPE UsageType = FUT_GENERIC; pfiu->GetUsage(&UsageType); switch(UsageType) { case FUT_PLAYING: Reason = MObjectLockedReasonPlayed; break; case FUT_EDITING: Reason = MObjectLockedReasonEdited; break; case FUT_GENERIC: Reason = MObjectLockedReasonOpened; break; } DWORD Capabilities = 0; pfiu->GetCapabilities(&Capabilities); if(Capabilities&OF_CAP_CANSWITCHTO) { SwitchBtn = true; } if(Capabilities&OF_CAP_CANCLOSE) { CloseBtn = true; } LPWSTR AppName = nullptr; if(SUCCEEDED(pfiu->GetAppName(&AppName))) { Msg.emplace_back(AppName); } } else { DWORD dwSession; WCHAR szSessionKey[CCH_RM_SESSION_KEY+1] = {}; if (Imports().RmStartSession(&dwSession, 0, szSessionKey) == ERROR_SUCCESS) { PCWSTR pszFile = FullName.data(); if (Imports().RmRegisterResources(dwSession, 1, &pszFile, 0, nullptr, 0, nullptr) == ERROR_SUCCESS) { DWORD dwReason; DWORD RmGetListResult; UINT nProcInfoNeeded; UINT nProcInfo = 1; std::vector<RM_PROCESS_INFO> rgpi(nProcInfo); while((RmGetListResult=Imports().RmGetList(dwSession, &nProcInfoNeeded, &nProcInfo, rgpi.data(), &dwReason)) == ERROR_MORE_DATA) { nProcInfo = nProcInfoNeeded; rgpi.resize(nProcInfo); } if(RmGetListResult ==ERROR_SUCCESS) { for (size_t i = 0; i < nProcInfo; i++) { string tmp = rgpi[i].strAppName; if (*rgpi[i].strServiceShortName) { tmp.append(L" [").append(rgpi[i].strServiceShortName).append(L"]"); } tmp += L" (PID: " + std::to_wstring(rgpi[i].Process.dwProcessId); HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, rgpi[i].Process.dwProcessId); if (hProcess) { FILETIME ftCreate, ftExit, ftKernel, ftUser; if (GetProcessTimes(hProcess, &ftCreate, &ftExit, &ftKernel, &ftUser) && rgpi[i].Process.ProcessStartTime == ftCreate) { string Name; if (os::GetModuleFileNameEx(hProcess, nullptr, Name)) { tmp += L", " + Name; } } CloseHandle(hProcess); } tmp += L")"; Msg.emplace_back(tmp); } } } Imports().RmEndSession(dwSession); } } } auto Msgs = make_vector(Description, QuoteLeadingSpace(string(Object))); if(!Msg.empty()) { Msgs.emplace_back(LangString(MObjectLockedReason) << MSG(Reason)); Msgs.insert(Msgs.end(), ALL_CONST_RANGE(Msg)); } std::vector<string> Buttons; Buttons.reserve(4); if(SwitchBtn) { Buttons.emplace_back(MSG(MObjectLockedSwitchTo)); } Buttons.emplace_back(MSG(CloseBtn? MObjectLockedClose : MDeleteRetry)); if(AllowSkip) { Buttons.emplace_back(MSG(MDeleteSkip)); Buttons.emplace_back(MSG(MDeleteFileSkipAll)); } Buttons.emplace_back(MSG(MDeleteCancel)); int Result = -1; for(;;) { Result = Message(MSG_WARNING|MSG_ERRORTYPE, MSG(Title), Msgs, Buttons); if(SwitchBtn) { if(Result == 0) { HWND Wnd = nullptr; if (pfiu && SUCCEEDED(pfiu->GetSwitchToHWND(&Wnd))) { SetForegroundWindow(Wnd); if (IsIconic(Wnd)) ShowWindow(Wnd, SW_RESTORE); } continue; } else if(Result > 0) { --Result; } } if(CloseBtn && Result == 0) { // close & retry if (pfiu) { pfiu->CloseFile(); } } break; } if (pfiu) { pfiu->Release(); } return Result; }
unsigned int CancelSynchronousIoWrapper(void* Thread) { unsigned int Result = Imports().CancelSynchronousIo(Thread); CancelIoInProgress().Reset(); return Result; }