Customize default taskbar tasks in Windows 7 taskbar "jump list" - winapi

I have a program A.exe that bootstraps another process B.exe, passing dynamic command line arguments to B.exe. The default Windows 7 taskbar task list will provide an option to start another instance of B.exe as its top option. For example: http://cl.ly/image/2C1X2g1A2K0k the top option will open another instance of the command window.
What I desire is to customize this default task list - via Win32/Shell APIs - so that the top option actually opens A.exe instead of B.exe. Is this possible? This also goes for when the application is "pinned"; the pinned button should point to, and load A.exe. Because B.exe needs dynamic command line parameters that are determined by A.exe, this is a requirement. B.exe has no knowledge of A.exe.
If this is not possible, is there any other workaround (i.e. shell links, shortcuts, etc) that can be used to get this functionality? Or is there simply a way to disable that task list altogether?
Thanks in advance. If this question is not clear, please let me know and I'll update the description.

A good solution to this problem was to use a shortcut (.lnk) file, combined with the STARTF_TITLEISLINKNAME flag as explained on the MSDN page. Windows will use the shortcut as its taskbar task item for starting new instances of the application (the top entry on the task list) as well as when the application is pinned to the taskbar.
For example, assuming B.lnk points to B.exe, we can put into A.exe:
PROCESS_INFORMATION piProcInfo;
ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION));
STARTUPINFO siStartInfo;
ZeroMemory(&siStartInfo, sizeof(STARTUPINFO));
siStartInfo.cb = sizeof(STARTUPINFO);
siStartInfo.lpTitle = (LPTSTR)L"C:\Path\to\B.lnk";
siStartInfo.dwFlags = STARTF_TITLEISLINKNAME;
CreateProcess(NULL,
(LPTSTR)L"C:\Path\to\B.exe",
NULL,
NULL,
TRUE,
CREATE_NO_WINDOW,
NULL,
NULL,
&siStartInfo,
&piProcInfo);
Hope that helps someone with a similar niche use case.

Related

having handle to a menu (HMENU) is it possible to find it's parent window (HWND)?

I know about the option for system menu, that is the alt+space one. And it's not pretty it involves looping all open windows through GetNextWindow. But I want to ask in more general way. That is having any menu handle, not necessarily to system menu (that is easy to find for any window) is it possible to get to its parent window ?
In the particular case when hmenu obtained on the fly from an existing menu-window (class #32768):
you can use GUITHREADINFO.hwndMenuOwner via GetGUIThreadInfo(GetWindowThreadProcessId).
"On the fly" means: via SendMessageTimeout(MN_GETHMENU) or via GetMenuBarInfo(OBJID_CLIENT), after WindowFromPoint.
No. Menus can be shared across windows, so there's no unique mapping from menus to windows.

I want to display the active window

SetWindowPos(hwnd, hWndTopMost, 0, 0,
Screen.PrimaryScreen.Bounds.Size.Width,
Screen.PrimaryScreen.Bounds.Size.Height,
SWP_NOOWNERZORDER);
This is my code to display my form full screen and at the top, but when I am inducing alt+ctrl+delete, the task manager is activated at the back of this form even though my form is not active. I understand by the colour of caption bar. This problem is only occuring in win8 os. I want to display the task manager which is active but without losing the properties of my app like hooking. How can I achieve it by changing the flags of the above?
You can't achieve it with documented WinAPI functions.
The Task Manager in Windows 8 uses an undocumented method in order to become on top of all windows, including the top-most ones.
Specifically, it uses the CreateWindowInBand WinAPI function to achieve the effect.

Change console color of child process

I'm creating a new process which calls a console application. I want to change the colors of this child process's console window.
The reason is that I can't redirect the console's stdout because the application manipulates the console cursor. Instead I'm stripping the console frame, clipping the info I want and embed the console in my application wholesale. I just want to change the colors so it fits in better.
I know of the SetConsoleTextAttribute function but I don't know how to get to the stdout handle of the child process to use it.
Anyone have any ideas?
The documentation for DuplicateHandle says:
Console handles can be duplicated for use only in the same process
(They are not real handles) so even if you could inject code into the child you could not go down this route.
I'm assuming the parent application does not already have a console (You can only have one per process without doing horrible hacks), if that is the case you should be able to use AllocConsole(), GetStdHandle(), SetConsoleTextAttribute(), CreateProcess() and finally FreeConsole() (You don't need FreeConsole if you only run one child process at the time)
The other option is to use cmd.exe: cmd.exe /T:?? /C childapplication.exe (Replace ?? with the color values you find by running color /? in cmd)

Win32 custom message box

I want to make a custom message box. What I want to customize is the button's text.
MessageBoxW(
NULL,
L"Target folder already exists. Do you want to overwrite the folder?",
L"No title",
MB_YESNOCANCEL | MB_ICONQUESTION
);
I'd like to just change the buttons text to Overwrite, Skip, Cancel.
What's the most simple way?
I have to make this as having same look and feel with Windows default messagebox.
As said by others, a typical way is to create a dialog resource and have a completely independent dialog, which GUI you need to design in the way that it looks like standard dialog (to meet your request for feel and look). If you want to accept text messages, you might probably need to add code which resizes the window appropriately.
Still, there is another option for those who feel like diving into advanced things. While MessageBox API does not offer much for fint tuning, you still have SetWindowsHookEx in your hands. Having registgered the hook, you can intercept standard MessageBox window procedure and subclass it in the way you like.
Typical things include:
changing button text
adding more controls
adding timed automatic close
Hooking standard window can do all of those.
UPD. Hey, I realized I have some code with SetWindowsHookEx to share: http://alax.info/blog/127
You could create an own dialog. Or you could use a window hook as described in this article.
An archived version of the article can be found on web.archive.com.
Make a dialog resource (with a GUI editor, or by hand) and call DialogBox on it. There's no way to alter MessageBox behaviour, other than what's supported by its arguments.
That said, your message box can very well use stock Yes/No options.
The task dialog functionality introduced in Vista does exactly what you want and follows the prevailing system theme. However, if you have to support XP, then this will be of little comfort to you.
I know this question is old, but I just stumbled upon it now.
I would like to expand the other answers in regards to using a TaskDialog instead of a MessageBox. Here's a concise example of using a TaskDialog to do precisely what was asked; change the button's texts:
const TASKDIALOG_BUTTON buttons[] = { {IDYES, L"Overwrite"}, {IDNO, L"Skip"}, {IDCANCEL, L"Cancel"} };
TASKDIALOGCONFIG taskDialogConfig = {
.cbSize = sizeof(TASKDIALOGCONFIG),
.pszMainIcon = TD_WARNING_ICON, // TaskDialog does not support a question icon; see below
.pButtons = buttons,
.cButtons = ARRAYSIZE(buttons),
.pszWindowTitle = L"No title",
.pszContent = L"Target folder already exists. Do you want to overwrite the folder?"
};
TaskDialogIndirect(&taskDialogConfig, NULL, NULL, NULL);
Some noteworthy things:
You need to use TaskDialogIndirect, not the basic TaskDialog function
when not specifying a parent window, the icon specified in pszMainIcon is displayed in the title bar as well
There is no equivalent to the MessageBox's MB_ICONQUESTION, quoting a quote from this forumpost: Don't use the question mark icon to ask questions. Again, use the question mark icon only for Help entry points. There is no need to ask questions using the question mark icon anyway—it's sufficient to present a main instruction as a question.
checking which button was selected would have to be done by passing a pointer to an int as the second argument of TaskDialogIndirect and checking its value on return (the documentation should be pretty clear)
Here is a small open source library that allows you to customize Message Boxes. Developed by Hans Ditrich.
I have successfully used it in another POC that allows embedding a custom icon in such MessageBox that can be called even from a Console application.
I should also point to the Task Dialog. Here is an example of using it:
int nButtonPressed = 0;
TaskDialog(NULL, hInst,
MAKEINTRESOURCE(IDS_APPLICATION_TITLE),
MAKEINTRESOURCE(IDS_DOSOMETHING),
MAKEINTRESOURCE(IDS_SOMECONTENT),
TDCBF_OK_BUTTON | TDCBF_CANCEL_BUTTON,
TD_WARNING_ICON,
&nButtonPressed);
if (IDOK == nButtonPressed)
{
// OK button pressed
}
else if (IDCANCEL == nButtonPressed)
{
// Cancel pressed
}

What are the Win32APIs corresponding to the "Parent" and "Owner" Window values displayed by MS Spy++?

I'd like to obtain the same values via code. However I'd like to obtain the top-most or root windows in the hierarchy
I seem to have got the Root Parent with
HWND rootWinHandle = GetAncestor(activatedWinHandle, GA_PARENT);
However I can't get the owner window correctly. Tried
HWND rootOwnerWinHandle = GetAncestor(activatedWinHandle, GA_ROOTOWNER);
For a particular modeless dialog, Spy++ returns the Main Exe window whereas the above line returns the input i.e. activatedWinHandle. Am I looking at the wrong api ?
I'd like to obtain this without MFC if possible... coz nothing else in my project requires it.
See the GW_OWNER flag for GetWindow.
The GetParent documentation states:
If the window is a child window, the return value is a handle to the parent window. If the window is a top-level window, the return value is a handle to the owner window.
Try GetParent(). I believe this will return the owner window of a window without the WS_CHILD style, and the parent window of a window with WS_CHILD.
Only bit of insight i can add it from Raymond Chen:
Remember that owner and parent are two
different things.
Modal dialogs disable their OWNERs.
All top-level windows have the desktop
as their PARENT.
From: What's so special about the desktop window?
Special demo (+src):
http://files.rsdn.ru/42164/parentowner.zip
screenshot: http://files.rsdn.ru/42164/parentowner.png
kero

Resources