// // LSExecute // HINSTANCE LSExecute(HWND hOwner, LPCSTR pszCommand, int nShowCmd) { char szCommand[MAX_LINE_LENGTH]; char szExpandedCommand[MAX_LINE_LENGTH]; LPCSTR pszArgs; HINSTANCE hResult = HINSTANCE(32); if (pszCommand != NULL) { VarExpansionEx(szExpandedCommand, pszCommand, MAX_LINE_LENGTH); if (GetToken(szExpandedCommand, szCommand, &pszArgs, TRUE)) { if (pszArgs > (szExpandedCommand + strlen(szExpandedCommand))) { pszArgs = NULL; } if (szCommand[0] == '!') { hResult = LSExecuteEx(hOwner, NULL, szCommand, pszArgs, NULL, 0); } else { char szDir[_MAX_DIR]; char szFullDir[_MAX_DIR + _MAX_DRIVE]; _splitpath(szCommand, szFullDir, szDir, NULL, NULL); StringCchCat(szFullDir, _MAX_DIR + _MAX_DRIVE, szDir); hResult = LSExecuteEx(hOwner, NULL, szCommand, pszArgs, szFullDir, nShowCmd ? nShowCmd : SW_SHOWNORMAL); } } } return hResult; }
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case LM_GETREVID: { char *buf = (char *) lParam; if (wParam == 0) { strcpy(buf, "hotkey.dll: "); strcat(buf, &rcsRevision[11]); buf[strlen(buf)-1] = '\0'; } else if (wParam == 1) { strcpy(buf, &rcsId[1]); buf[strlen(buf)-1] = '\0'; } else { strcpy(buf, ""); } return strlen(buf); } case WM_ENDSESSION: case WM_QUERYENDSESSION: return SendMessage(parent,message,wParam,lParam); case WM_SYSCOMMAND: { switch (wParam) { case SC_CLOSE: PostMessage(parent,WM_KEYDOWN,LM_SHUTDOWN,0); return 0; default: return DefWindowProc(hwnd,message,wParam,lParam); } } case WM_CREATE: { int i; for (i=0;i<numHotkeys;i++) { RegisterHotKey(hwnd,i,hotkeys[i].sub,hotkeys[i].ch); } if (GetRCBool("HotkeyNoWinKeyPopup",FALSE)){ if (!RegisterHotKey(hwnd, GlobalAddAtom("LWIN_KEY"),MOD_WIN, VK_LWIN)){ MessageBox(NULL,"Error registering Win Key",szAppName,MB_OK); } if (!RegisterHotKey(hwnd, GlobalAddAtom("RWIN_KEY"),MOD_WIN, VK_RWIN)){ MessageBox(NULL,"Error registering Win Key",szAppName,MB_OK); } } if (GetRCBool("LSNoShellWarning", FALSE) && GetRCBool("ExplorerNoWarn", FALSE)){ if (!RegisterHotKey(hwnd, GlobalAddAtom("CTL_ESC"),MOD_CONTROL,VK_ESCAPE)){ MessageBox(NULL,"Error registering Ctrl+Esc",szAppName,MB_OK); } } } return 0; case WM_DESTROY: UnregisterHotKey(hwnd, GlobalFindAtom("LWIN_KEY")); UnregisterHotKey(hwnd, GlobalFindAtom("RWIN_KEY")); UnregisterHotKey(hwnd, GlobalFindAtom("CTL_ESC")); GlobalDeleteAtom(GlobalFindAtom("LWIN_KEY")); GlobalDeleteAtom(GlobalFindAtom("RWIN_KEY")); GlobalDeleteAtom(GlobalFindAtom("CTL_ESC")); return 0; case WM_ERASEBKGND: return 0; case WM_PAINT: return 0; case WM_HOTKEY: { if (wParam < (WPARAM) numHotkeys) { int num = wParam; if (lstrlen(hotkeys[num].szCommand)) { if (hotkeys[num].szCommand[0] == '!') { KillTimer(hwnd, 1); ParseBangCommand(hwnd, hotkeys[num].szCommand, hotkeys[num].szParameters); } else { char workDirectory[_MAX_PATH], drive[_MAX_DRIVE], dir[_MAX_DIR]; _splitpath(hotkeys[num].szCommand, drive, dir, NULL, NULL); strcpy(workDirectory, drive); strcat(workDirectory, dir); LSExecuteEx(GetDesktopWindow(), NULL, hotkeys[num].szCommand, hotkeys[num].szParameters, workDirectory, SW_SHOWNORMAL); KillTimer(hwnd, 1); /* SHELLEXECUTEINFO si; char workDirectory[MAX_PATH]; char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; _splitpath(hotkeys[num].szCommand, drive, dir, NULL, NULL); strcpy(workDirectory, drive); strcat(workDirectory, dir); memset(&si, 0, sizeof(si)); si.cbSize = sizeof(SHELLEXECUTEINFO); si.lpDirectory = workDirectory; si.lpVerb = NULL; si.nShow = 1; si.fMask = SEE_MASK_DOENVSUBST; si.lpFile = hotkeys[num].szCommand; si.lpParameters = hotkeys[num].szParameters; ShellExecuteEx(&si); */ } } } else { char szCommand[1024]; if (GlobalGetAtomName((ATOM)wParam, szCommand, 1024) > 0) { if (!strcmp(szCommand, "CTL_ESC")) SendMessage(parent, LM_POPUP, 0, 0); else if (!strcmp(szCommand, "REINIT") && GetRCBool("HotkeyLoadExplorerKeys", TRUE)) { drizzt_FreeHotKeys(); drizzt_InitHotKeys(); } else if (!strcmp(szCommand, "LWIN_KEY")) { SetTimer(hwnd, 1, 750, NULL); } else if (!strcmp(szCommand, "RWIN_KEY")) { SetTimer(hwnd, 1, 750, NULL); } else { KillTimer(hwnd, 1); if (GetRCBool("HotkeyLoadExplorerKeys", TRUE)){ drizzt_execute(szCommand, NULL, NULL); } } } } break; } case WM_TIMER: if (wParam == 1) { ParseBangCommand(hwnd, "!Popup", NULL); KillTimer(hwnd, 1); } } return DefWindowProc(hwnd,message,wParam,lParam); }
/************************************************************************************************** This function handles events. **************************************************************************************************/ void CGroup::HandleEvent(UINT uEvent) { if (_stricmp(m_szEventCommand[uEvent], EVENT_ACTION_NONE) == 0) { return; } else if (_stricmp(m_szEventCommand[uEvent], EVENT_ACTION_RENAME) == 0) { ListView_EditLabel(m_hwndListView, ListView_GetNextItem(m_hwndListView, -1, LVNI_FOCUSED)); } else if (_stricmp(m_szEventCommand[uEvent], EVENT_ACTION_EXECUTE) == 0) { if (ListView_GetSelectedCount(m_hwndListView) == 1) { int iItem = ListView_GetNextItem(m_hwndListView, -1, LVNI_SELECTED); char szFileName[MAX_PATH]; if (GetNameFromId(iItem, szFileName, sizeof(szFileName))) { if (utils::Is_Directory(szFileName)) { if (m_bInlineBrowsing) { return ChangeDir(".selected"); } else if (m_bExplicitCalls) { LSExecuteEx(NULL, "open", "explorer.exe", szFileName, NULL, SW_SHOWNORMAL); return; } } } } CallWindowProc(m_wpOrigListViewProc, m_hwndListView, WM_KEYDOWN, VK_RETURN, NULL); } else if (_stricmp(m_szEventCommand[uEvent], EVENT_ACTION_DELETE) == 0) { DeleteFiles(); } else if (_stricmp(m_szEventCommand[uEvent], EVENT_ACTION_PASTE) == 0) { DoPaste(); } else if (_stricmp(m_szEventCommand[uEvent], EVENT_ACTION_UNDO) == 0) { // TODO::Add support for this } else if (_stricmp(m_szEventCommand[uEvent], EVENT_ACTION_COPY) == 0) { CopyFiles(false); } else if (_stricmp(m_szEventCommand[uEvent], EVENT_ACTION_CUT) == 0) { CopyFiles(true); } else if (_stricmp(m_szEventCommand[uEvent], EVENT_ACTION_SELECTALL) == 0) { ListView_SetItemState(m_hwndListView, -1, LVIS_SELECTED, LVIS_SELECTED); } else if (_stricmp(m_szEventCommand[uEvent], EVENT_ACTION_REFRESH) == 0) { SaveState(); m_pView2->Refresh(); RestoreState(); } else if (_stricmp(m_szEventCommand[uEvent], EVENT_ACTION_UP) == 0) { ChangeDir(".up"); } else if (_stricmp(m_szEventCommand[uEvent], EVENT_ACTION_CHANGEDIR) == 0) { ChangeDir(".selected"); } else if (_stricmp(m_szEventCommand[uEvent], EVENT_ACTION_DOWNKEY) == 0) { CallWindowProc(m_wpOrigListViewProc, m_hwndListView, WM_KEYDOWN, VK_DOWN, NULL); } else if (_stricmp(m_szEventCommand[uEvent], EVENT_ACTION_UPKEY) == 0) { CallWindowProc(m_wpOrigListViewProc, m_hwndListView, WM_KEYDOWN, VK_UP, NULL); } else if (_stricmp(m_szEventCommand[uEvent], EVENT_ACTION_LEFTKEY) == 0) { CallWindowProc(m_wpOrigListViewProc, m_hwndListView, WM_KEYDOWN, VK_LEFT, NULL); } else if (_stricmp(m_szEventCommand[uEvent], EVENT_ACTION_RIGHTKEY) == 0) { CallWindowProc(m_wpOrigListViewProc, m_hwndListView, WM_KEYDOWN, VK_RIGHT, NULL); } else { LSExecute(m_hwndListView, m_szEventCommand[uEvent], SW_SHOWNORMAL); } }