From: <ir0...@us...> - 2009-12-10 04:07:31
|
Revision: 2760 http://emerge.svn.sourceforge.net/emerge/?rev=2760&view=rev Author: ir0nh34d Date: 2009-12-10 04:07:21 +0000 (Thu, 10 Dec 2009) Log Message: ----------- Fix handling of console based shortcuts with icons and window properties Modified Paths: -------------- trunk/Source/emergeLib/main.cpp Modified: trunk/Source/emergeLib/main.cpp =================================================================== --- trunk/Source/emergeLib/main.cpp 2009-12-09 05:53:31 UTC (rev 2759) +++ trunk/Source/emergeLib/main.cpp 2009-12-10 04:07:21 UTC (rev 2760) @@ -105,6 +105,7 @@ std::wstring GetWindowApp(DWORD processID, bool fullName); bool WriteValue(const WCHAR *fileName, WCHAR *keyword, WCHAR *value); BOOL CALLBACK FullscreenEnum(HWND hwnd, LPARAM lParam); +BOOL CALLBACK WindowIconEnum(HWND hwnd, LPARAM lParam); bool GetSpecialFolderGUID(int folder, WCHAR *classID); bool GetPIDLGUID(LPITEMIDLIST pidl, WCHAR *classID); bool VistaVolumeControl(UINT command); @@ -1372,6 +1373,15 @@ return ELExecute(command); } +BOOL CALLBACK WindowIconEnum(HWND hwnd, LPARAM lParam) +{ + std::wstring debug = L"In Enum"; + ELWriteDebug(debug); + SendMessage(hwnd, WM_SETICON, ICON_SMALL, lParam); + SendMessage(hwnd, WM_SETICON, ICON_BIG, lParam); + return TRUE; +} + //---- -------------------------------------------------------------------------------------------------------- // Function: ELExecute // Requires: LPTSTR applicaiton - application to execute @@ -1389,7 +1399,8 @@ SHORTCUTINFO shortcutInfo; STARTUPINFO si; PROCESS_INFORMATION pi; - std::wstring workingString = application; + std::wstring workingString = application, shortcutPath; + bool isShortcut = false; ZeroMemory(&sei, sizeof(sei)); ZeroMemory(&si, sizeof(si)); @@ -1399,12 +1410,14 @@ ZeroMemory(arguments, MAX_LINE_LENGTH); workingString = ELExpandVars(workingString); + shortcutPath = workingString; ELParseCommand(workingString.c_str(), program, arguments); - shortcutInfo.flags = SI_PATH|SI_ARGUMENTS|SI_WORKINGDIR|SI_SHOW; + shortcutInfo.flags = SI_PATH | SI_ARGUMENTS | SI_WORKINGDIR | SI_SHOW; workingString = program; if (ELParseShortcut(workingString.c_str(), &shortcutInfo)) { + isShortcut = true; wcscpy(program, shortcutInfo.Path); wcscpy(arguments, shortcutInfo.Arguments); wcscpy(directory, shortcutInfo.WorkingDirectory); @@ -1439,8 +1452,24 @@ return false; si.cb = sizeof(si); - si.dwFlags = STARTF_USESHOWWINDOW; - si.wShowWindow = nShow; + if (isShortcut) + { + // 0x800 is an undocumented flag that tells the new process that lpTitle + // is actually the path of a shortcut file. The new console process can + // then extract the icon and title from the shortcut it was launched from. + // + // For console shortcuts, the title is key because that's what used to + // determine window dimensions and buffers (similar to when you change the + // default options you are given the choice to 'Save properties for future + // windows with the same title'. + si.dwFlags = 0x800; + si.lpTitle = (WCHAR*)shortcutPath.c_str(); + } + else + { + si.dwFlags = STARTF_USESHOWWINDOW; + si.wShowWindow = nShow; + } if (CreateProcess(NULL, command, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |