// // LSExecuteEx // HINSTANCE LSExecuteEx(HWND hOwner, LPCSTR pszOperation, LPCSTR pszCommand, LPCSTR pszArgs, LPCSTR pszDirectory, int nShowCmd) { HINSTANCE hReturn = HINSTANCE(32); if (pszCommand != NULL) { if (pszCommand[0] == '!') { hReturn = ParseBangCommand(hOwner, pszCommand, pszArgs) ? HINSTANCE(33) : HINSTANCE(32); } else { TRACE("LSExecuteEx(%.8X, \"%s\", \"%s\", \"%s\", \"%s\", %d);", hOwner, pszOperation, pszCommand, pszArgs,pszDirectory, nShowCmd); if (PathIsDirectory(pszCommand)) { hReturn = LSShellExecute(hOwner, pszOperation, pszCommand, pszArgs, NULL, nShowCmd ? nShowCmd : SW_SHOWNORMAL); } else { SHELLEXECUTEINFO seiCommand = { 0 }; seiCommand.cbSize = sizeof(SHELLEXECUTEINFO); seiCommand.hwnd = hOwner; seiCommand.lpVerb = pszOperation; seiCommand.lpFile = pszCommand; seiCommand.lpParameters = pszArgs; seiCommand.lpDirectory = pszDirectory; seiCommand.nShow = nShowCmd; seiCommand.fMask = SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_NO_UI; LSShellExecuteEx(&seiCommand); hReturn = seiCommand.hInstApp; } } } return hReturn; }
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); }