# Windows Programming/Programming Shell Extensions

The Windows Shell consists primarily of explorer.exe, the graphical user interface that displays folders, icons, and the desktop. Explorer.exe is written primarily in C++, so to write extension modules is going to require OO programming. However, there are several functions, in <windows.h> that a C program can use to interact with the shell to perform some basic tasks. First, we will describe some of the basic areas of your shell.

## The Shell

explorer.exe, the Windows shell program, has a number of different functions that can be used to cause your program to perform tasks like the shell would. We will run over a few of them here:

### ShellExecute

The ShellExecute function takes a file and a pathname as arguments, and essentially performs whatever task the shell would perform if the file in question was double-clicked. For instance, calling a ShellExecute on "MyFile.txt" would open notepad, and would display MyFile.txt. Similarly, calling ShellExecute on a hyperlink will automatically open Internet Explorer (or your default browser) and will open the specified URL.

#### hwnd

    The handle to the parent window of the operation

#### lpOperation

    The text name of the operation. These are the strings that appear in the menu when you right-click an icon. Some common values are "edit", "run", or "execute".

#### lpFile

    the name of the target file

#### lpParameters

    If lpFile specifies an executable file, the lpParameters field contains the commandline arguments to the executable, if any

#### lpDirectory

    specifies what directory to perform the operation in

#### nShowCmd
## The System Tray

The system tray is the area in the lower-right hand side of the screen that contains the clock and a number of different icons. Icons can be added to the system tray by using a simple API call. The function call to be used is the Shell_NotifyIcon function, and we will explain it here.
This function takes 2 arguments. The first argument is a message, and the second argument contains more information on the message. There are 3 messages possible:
We can see that the second argument is a pointer to the NOTIFYICONDATA structure. This structure contains fields as such:

### cbSize

    This should reflect the size of the NOTIFYICON structure. If we have a structure called "nid", we usually assign this member as follows:

### hWnd

    This field contains the handle of the parent window. When the notify icon is clicked, a corresponding message will be sent to this window.

### uID

    This is a numerical identifier for the icon in question. A program can have up to 12 different icons at once.

### uCallbackMessage

    This is the message that will be sent to your window. This message should be WM_USER or greater. The WPARAM field of the message will contain the uID of the icon in question.

### uFlags

    This member tells the shell which fields are valid fields. If a field does not contain any information, or if you don't want to use a particular field to set or modify a value, do not list them in the uFlags member. The possible values are NIF_ICON, NIF_MESSAGE, and NIF_TIP.

### hIcon

    a handle to the icon to be displayed in the system tray. must be a 16x16 icon.

### szTip

    A short string that contains a "tooltip" for the icon. When the mouse is hovered over the icon, the tooltip will be displayed. leave this blank, if you do not want to have a tool tip displayed.