Interpolation (Resizing) of a Bitmap image

20 10 2009
#define PADBYTES 4
int Interpolation(BYTE* pbySrc, BYTE* pbyDest, int iSrcWidth, int iSrcHeight, int iSrcBPP, int iDestWidth, int iDestHeight)
{  
 //process each line
 for (int iRow = 0; iRow < iDestHeight; iRow++)
 {
 double ay = (double) iRow * iSrcHeight / iDestHeight;    //scaled source iRow
 int     y = (int)ay;                                    //truncates source iRow
 ay = ay - y;                                        //distance as fractional part of the scaled pixel, used for weighting

 //process each pixel within the line
 for (int iCol = 0; iCol < iDestWidth; iCol++)
 {
 double R, G, B;

 double ax = (double)iCol * iSrcWidth / iDestWidth;    //scaled source column
 int     x = (int)ax;                                //truncates source column
 ax = ax - x;                                    //distance as fractional part of the scaled pixel, used for weighting

 if ((x < iSrcWidth - 1) && (y < iSrcHeight - 1))
 {
 //interpolate each channel
 R = (1.0 - ax) * (1.0 - ay) * GetValueR(x+0, y+0, iSrcWidth, iSrcHeight, pbySrc) +
 ax  * (1.0 - ay) * GetValueR(x+1, y+0, iSrcWidth, iSrcHeight, pbySrc) +
 (1.0 - ax) *        ay  * GetValueR(x+0, y+1, iSrcWidth, iSrcHeight, pbySrc) +
 ax  *        ay  * GetValueR(x+1, y+1, iSrcWidth, iSrcHeight, pbySrc);

 G = (1.0 - ax) * (1.0 - ay) * GetValueG(x+0, y+0, iSrcWidth, iSrcHeight, pbySrc) +
 ax  * (1.0 - ay) * GetValueG(x+1, y+0, iSrcWidth, iSrcHeight, pbySrc) +
 (1.0 - ax) *        ay  * GetValueG(x+0, y+1, iSrcWidth, iSrcHeight, pbySrc) +
 ax  *        ay  * GetValueG(x+1, y+1, iSrcWidth, iSrcHeight, pbySrc);

 B = (1.0 - ax) * (1.0 - ay) * GetValueB(x+0, y+0, iSrcWidth, iSrcHeight, pbySrc) +
 ax  * (1.0 - ay) * GetValueB(x+1, y+0, iSrcWidth, iSrcHeight, pbySrc) +
 (1.0 - ax) *        ay  * GetValueB(x+0, y+1, iSrcWidth, iSrcHeight, pbySrc) +
 ax  *        ay  * GetValueB(x+1, y+1, iSrcWidth, iSrcHeight, pbySrc);
 }
 else
 {
 //set to zero to blank these lines instead of copying source
 R = pbySrc[y * iSrcWidth * iSrcBPP + x * iSrcBPP + 0];
 G = pbySrc[y * iSrcWidth * iSrcBPP + x * iSrcBPP + 1];
 B = pbySrc[y * iSrcWidth * iSrcBPP + x * iSrcBPP + 2];
 }

 //write to destination buffer, change order for BGR
 *pbyDest++ = (BYTE)R;
 *pbyDest++ = (BYTE)G;
 *pbyDest++ = (BYTE)B;
 }

 int iPad = (iDestWidth * 3) % PADBYTES ? PADBYTES - (iDestWidth * 3) % PADBYTES : 0;
 for (int idx = 0; idx < iPad; idx++)
 {
 *pbyDest++ = 0;
 }
 }
 return 0;
}

pbySrc      -> Source Buffer
pbyDest     -> Destination Buffer
iSrcWidth   -> Source Image Width
iSrcHeight  -> Source Image Height
iSrcBPP     -> Bytes per pixel od the source Image
iDestWidth  -> New width of the image
iDestHeight -> New Height of the Image

NB: The memory allocation for the new image should be allocated. the Bytes per pixel of the new image is 3. For the other function used here please refer the previous posts.





To Change the Sharpness of R, G,B values of a Pixel of the image

16 10 2009
int SetSharpnessR(int iX, int iY, int iWidth, int iHeight, int iBPP, BYTE *pbySrc, double dbSharpnessR)
{
 int MaskMatrix[3][3] ={{1,  1,  1}, {1, -8,  1}, {1,  1,  1} };
 double dbPixelValueR = 0.0;
 int i, j, iRed;

 for (j = -1; j <2 ; j++)
 {
 for (i = -1; i <2 ; i++)
 {
 dbPixelValueR += MaskMatrix[j+1][i+1] * GetValueR(iX+j, iY+i, iWidth, iHeight, iBPP, pbySrc);
 }
 }
 iRed = (int)(GetValueR(iX, iY, iWidth, iHeight, iBPP, pbySrc) - (dbSharpnessR * dbPixelValueR));
 return Clip(iRed);
}

int SetSharpnessG(int iX, int iY, int iWidth, int iHeight, int iBPP, BYTE *pbySrc, double dbSharpnessG)
{
 int MaskMatrix[3][3] ={{1,  1,  1}, {1, -8,  1}, {1,  1,  1} };
 double dbPixelValueG = 0.0;
 int i, j, iGreen;

 for (j = -1; j <2 ; j++)
 {
 for (i = -1; i <2 ; i++)
 {
 dbPixelValueG += MaskMatrix[j+1][i+1] * GetValueG(iX+j, iY+i, iWidth, iHeight, iBPP, pbySrc);
 }
 }
 iGreen = (int)(GetValueG(iX, iY, iWidth, iHeight, iBPP, pbySrc) - (dbSharpnessG * dbPixelValueG));
 return Clip(iGreen);
}

int SetSharpnessB(int iX, int iY, int iWidth, int iHeight, int iBPP, BYTE *pbySrc, double dbSharpnessB)
{
 int MaskMatrix[3][3] ={{1,  1,  1}, {1, -8,  1}, {1,  1,  1} };
 double dbPixelValueB = 0.0;
 int i, j, iBlue;

 dbPixelValueB = 0.0;

 for (j = -1; j <2 ; j++)
 {
 for (i = -1; i <2 ; i++)
 {
 dbPixelValueB += MaskMatrix[j+1][i+1] * GetValueB(iX+j, iY+i, iWidth, iHeight, iBPP, pbySrc);
 }
 }
 iBlue = (int)(GetValueB(iX, iY, iWidth, iHeight, iBPP, pbySrc) - (dbSharpnessB * dbPixelValueB));
 return Clip(iBlue);
}

iX                       -> x cordinate of the Pixel
iY                       -> y cordinate of the Pixel
iWidth               -> Width of the Image
iHeight              -> Height of the Image
pbySrc              -> Pointer to the Buffer where image is readed
iBpp                   -> Bytes per pixel
dbSharpnessR  -> New Sharpness value of Red Component of the Pixel
dbSharpnessG  -> New Sharpness value of Green Component of the Pixel
dbSharpnessB  -> New Sharpness value of Blue Component of the Pixel

The Sharpness values should be in the range ie,  iBrightValR, iBrightValG, iBrightValB should be in 0.0 to 0.5
The default value is 0.0.

You can call these functions to the entire pixels of the image for the Sharpness change of the image

NB: For the other functions given here, please refer the previous posts





To Change the Contrast of R, G, B values of a Pixel of the image

16 10 2009
int ContrastR(int iX, int iY, int iWidth, int iHeight, int iBPP, BYTE *pbySrc, double dContrastValR)
{
 int iRed = GetValueR(iX, iY, iWidth, iHeight, iBPP, pbySrc);
 iRed = (int)floor((iRed - GREY) * dContrastValR) + GREY;
 return Clip(iRed);
}

int ContrastG(int iX, int iY, int iWidth, int iHeight, int iBPP, BYTE *pbySrc, double dContrastValG)
{
 int iGreen = GetValueG(iX, iY, iWidth, iHeight, iBPP, pbySrc);
 iGreen = (int)floor((iGreen - GREY) * dContrastValG) + GREY;
 return Clip(iGreen);
}

int ContrastB(int iX, int iY, int iWidth, int iHeight, int iBPP, BYTE *pbySrc, double dContrastValB)
{
 int iBlue = GetValueB(iX, iY, iWidth, iHeight, iBPP, pbySrc);
 iBlue = (int)floor((iBlue - GREY) * dContrastValB) + GREY;
 return Clip(iBlue);
}

iX                        -> x cordinate of the Pixel
iY                        -> y cordinate of the Pixel
iWidth                -> Width of the Image
iHeight               -> Height of the Image
pbySrc               -> Pointer to the Buffer where image is readed
iBpp                    -> Bytes per pixel
dContrastValR  -> New Contrast value of Red Component of the Pixel
dContrastValG  -> New Contrast value of Green Component of the Pixel
dContrastValB  -> New Contrast value of Blue Component of the Pixel

The Contrast values should be in the range ie,  iBrightValR, iBrightValG, iBrightValB should be in 0.0 to 4.0
The default value is 1.0.

You can call these functions to the entire pixels of the image for the Contrast change of the image

NB: For the other functions given here, please refer the previous posts





To Change the brightness of a Pixel of the image

16 10 2009
int BrightnessR(int iX, int iY, int iWidth, int iHeight, int iBPP, BYTE* pbySrc, int iBrightValR)
{
 return Clip(GetValueR(iX, iY, iWidth, iHeight, iBPP, pbySrc) + iBrightValR);
}

int BrightnessG(int iX, int iY, int iWidth, int iHeight, int iBPP, BYTE *pbySrc, int iBrightValG)
{
 return Clip(GetValueG(iX, iY, iWidth, iHeight, iBPP, pbySrc) + iBrightValG);
}

int BrightnessB(int iX, int iY, int iWidth, int iHeight, int iBPP, BYTE *pbySrc, int iBrightValB)
{
 return Clip(GetValueB(iX, iY, iWidth, iHeight, iBPP, pbySrc) + iBrightValB);
}

iX                   -> x cordinate of the Pixel
iY                   -> y cordinate of the Pixel
iWidth           -> Width of the Image
iHeight          -> Height of the Image
pbySrc          -> Pointer to the Buffer where image is readed
iBpp               -> Bytes per pixel
iBrightValR   -> New Brightness value of Red Component of the Pixel
iBrightValG   -> New Brightness value of Green Component of the Pixel
iBrightValB   -> New Brightness value of Blue Component of the Pixel

The Brightness values should be in the range ie,  iBrightValR, iBrightValG, iBrightValB should be in -128 to +128.
The default value is 0.

You can call these functions to the entire pixels of the image for the Brightness change of the image

NB: For the other functions given here, please refer the previous posts





To Change the Gamma of R, G,B values of a Pixel of the image

14 10 2009
#define MAXVAL          255.0
#define GAMMACONSTANT   1
int SetGammaR(int iX, int iY, int iWidth, int iHeight, int iBPP, BYTE *pbySrc, double dbGammaR)
{
 double dbR = (double)(GetValueR(iX, iY, iWidth, iHeight, iBPP, pbySrc) / MAXVAL);
 dbR = pow (dbR, dbGammaR);
 dbR = dbR > GAMMACONSTANT ? dbR - GAMMACONSTANT : dbR;
 return((int) (dbR * MAXVAL));
}

int SetGammaG(int iX, int iY, int iWidth, int iHeight, int iBPP, BYTE *pbySrc, double dbGammaG)
{
 double dbG = (double)(GetValueG(iX, iY, iWidth, iHeight, iBPP, pbySrc) / MAXVAL);
 dbG = pow (dbG, dbGammaG);
 dbG = dbG > GAMMACONSTANT ? dbG - GAMMACONSTANT : dbG;
 return((int) (dbG * MAXVAL));
}

int SetGammaB(int iX, int iY, int iWidth, int iHeight, int iBPP, BYTE *pbySrc, double dbGammaB)
{
 double dbB = (double)(GetValueB(iX, iY, iWidth, iHeight, iBPP, pbySrc) / MAXVAL);
 dbB = pow (dbB, dbGammaB);
 dbB = dbB > GAMMACONSTANT ? dbB - GAMMACONSTANT : dbB;
 return((int) (dbB * MAXVAL));
}

iX                    -> x cordinate of the Pixel
iY                    -> y cordinate of the Pixel
iWidth           -> Width of the Image
iHeight          -> Height of the Image
pbySrc           -> Pointer to the Buffer where image is readed
iBpp               -> Bytes per pixel
dbGammaR  -> New Gamma value of Red Component of the Pixel
dbGammaG  -> New Gamma value of Green Component of the Pixel
dbGammaB  -> New Gamma value of Blue Component of the Pixel

The Gamma values should be in the range ie,  dbGammaR,  dbGammaG,  dbGammaB should be in 0.0 to 4.00
The default value is 1.0.

You can call these functions to the entire pixels of the image for the Gamma change of the image

NB: For the other functions given here, please refer the previous posts






To Change the Saturation of R, G, B values of a Pixel of the image

14 10 2009
#define REDCONSTANT     0.299
#define GREENCONSTANT   0.587
#define BLUECONSTANT    0.114
#define LUMALIMIT       219.0/255.0
#define LUMAVAL         16
int SetSaturationR(int iX, int iY, int iWidth, int iHeight, int iBPP, BYTE *pbySrc, double dbSaturationR)
{
 double dbLum = 0.0;
 dbLum = (( (REDCONSTANT * GetValueR(iX, iY, iWidth, iHeight, iBPP, pbySrc)) + (GREENCONSTANT * GetValueG(iX, iY, iWidth, iHeight, iBPP, pbySrc))  + (BLUECONSTANT * GetValueB(iX, iY, iWidth, iHeight, iBPP, pbySrc))) * LUMALIMIT ) + LUMAVAL;
 return(Clip((int)(dbLum + (( GetValueR(iX, iY, iWidth, iHeight, iBPP, pbySrc)  - dbLum ) * dbSaturationR ))));
}

int SetSaturationG(int iX, int iY, int iWidth, int iHeight, int iBPP, BYTE *pbySrc, double dbSaturationG)
{
 double dbLum = 0.0;
 dbLum = (( (REDCONSTANT * GetValueR(iX, iY, iWidth, iHeight, iBPP, pbySrc)) + (GREENCONSTANT * GetValueG(iX, iY, iWidth, iHeight, iBPP, pbySrc))  + (BLUECONSTANT * GetValueB(iX, iY, iWidth, iHeight, iBPP, pbySrc))) * LUMALIMIT ) + LUMAVAL;
 return (Clip((int)(dbLum + (( GetValueG(iX, iY, iWidth, iHeight, iBPP, pbySrc)- dbLum ) * dbSaturationG ))));
}

int SetSaturationB(int iX, int iY, int iWidth, int iHeight, int iBPP, BYTE *pbySrc, double dbSaturationB)
{
 double dbLum = 0.0;
 dbLum = (( (REDCONSTANT * GetValueR(iX, iY, iWidth, iHeight, iBPP, pbySrc)) + (GREENCONSTANT * GetValueG(iX, iY, iWidth, iHeight, iBPP, pbySrc))  + (BLUECONSTANT * GetValueB(iX, iY, iWidth, iHeight, iBPP, pbySrc))) * LUMALIMIT ) + LUMAVAL;
 return (Clip((int)(dbLum + (( GetValueB(iX, iY, iWidth, iHeight, iBPP, pbySrc) - dbLum ) * dbSaturationB ))));
}

iX                        -> x cordinate of the Pixel
iY                        -> y cordinate of the Pixel
iWidth                -> Width of the Image
iHeight               -> Height of the Image
pbySrc               -> Pointer to the Buffer where image is readed
iBpp                    -> Bytes per pixel
dbSaturationR  -> New Saturation value of Red Component of the Pixel
dbSaturationG  -> New Saturation value of Green Component of the Pixel
dbSaturationB  -> New Saturation value of Blue Component of the Pixel

The Saturation values should be in the range ie,  iBrightValR, iBrightValG, iBrightValB should be in 0.0 to 2.00
The default value is 1.00.

You can call these functions to the entire pixels of the image for the Saturation change of the image

NB: For the other functions given here, please refer the previous posts





To get the R, G, B values of a pixel from a packed or interlaced frame

14 10 2009
#define BCHANNEL 0
#define GCHANNEL 1
#define RCHANNEL 2
unsigned char Clip(int iVal)
{
 return ( iVal > 255 ? 255 : ( iVal < 0 ) ? 0 : iVal) ;
}

//Pixel Functions
int GetValue(int iX, int iY, int iImageWidth, int iImageHeight, int iChannel, int iBPP, BYTE *pbySrc)
{
 Clip(iX);
 Clip(iY);
 return pbySrc[iY * iImageWidth * iBPP + iX * iBPP + iChannel];
}

int GetValueR(int iX, int iY, int iImageWidth, int iImageHeight, int iBPP, BYTE *pbySrc)
{
 return GetValue(iX, iY, iImageWidth, iImageHeight, RCHANNEL, iBPP,pbySrc);
}

int GetValueG(int iX, int iY, int iImageWidth, int iImageHeight, int iBPP, BYTE *pbySrc)
{
 return GetValue(iX, iY, iImageWidth, iImageHeight, GCHANNEL, iBPP, pbySrc);
}

int GetValueB(int iX, int iY, int iImageWidth, int iImageHeight, int iBPP, BYTE *pbySrc)
{
 return GetValue(iX, iY, iImageWidth, iImageHeight, BCHANNEL, iBPP, pbySrc);
}

Here the iX and iY values are the pixel positions
iImageWidth  -> Width of the Image
iImageHeight -> Height of the Image
iBPP                -> Bytes per pixel ie bitsperPixel/8. For eg. RGB 24 it is 3.
pbySrc            -> Address of the Source buffer

Call the GetValueR() for Red value of a pixel, Call the GetValueG() for Green value of a pixel and Call the GetValueB() for Blue value of a pixel from your application.

NB: These functions are applicatoion for interlaced fromat or packed RGB formats and not for the planar formats





To generate Random float/double numbers in a given limit

9 10 2009

Include these header files in you program and then use the given function.

#define _CRT_RAND_S
#include <stdio.h>
#include <stdlib.h>

If you need a random numbers in floating point then use this function

float RandF(float fMaxLimit)
{
 unsigned int    uiNumber;
 errno_t         err;

 err = rand_s( &uiNumber );
 if (err != 0)
 {
 return 0.0;
 }
 return ((float) uiNumber / (float) UINT_MAX * fMaxLimit);
}

If you need a random numbers in double then use this function

double RandDB(double dbMaxLimit)
{
 unsigned int    uiNumber;
 errno_t         err;

 err = rand_s( &uiNumber );
 if (err != 0)
 {
 return 0.0;
 }
 return ((double) uiNumber / (double) UINT_MAX * dbMaxLimit);
}

NB: The lower limit for the generated numbers is 0.0





Raw Video Viewer

2 10 2009

Raw Video Viewer is a full-featured tool for playback of uncompressed planar and packed YUV and RGB video and image files. It is intended for researchers in the area of video compression, developers of video codec and video chips and for all specialists involved in video and image processing.

A number of unique features and a thoroughly designed interface make this program the helpful tool necessary when the playback of uncompressed YUV and RGB video files is required.

Main Raw Video Player Deluxe features:

- playback of raw YUV video files in different resolutions, pixel formats and frame rates
- possibility to view separate (Y, U, V or R, G, B, Alpha) components of video frames
- possibility to save individual frames in 24-bit .bmp format
- possibility to convert to different raw formats. – User friendly interface.

Screen shot of Raw Video Viewer

Raw Video Viewer

If anybody needs this application, please mail me. My contact mail id is in the About Page. Please use this and send me you feed backs. Also please report the bugs and suggestions.

You can also download this from


Download Raw Video Viewer





Windows XP Keyboard Shortcuts

26 09 2009

General keyboard shortcuts
•    CTRL+C (Copy)
•    CTRL+X (Cut)
•    CTRL+V (Paste)
•    CTRL+Z (Undo)
•    DELETE (Delete)
•    SHIFT+DELETE (Delete the selected item permanently without placing the item in the Recycle Bin)
•    CTRL while dragging an item (Copy the selected item)
•    CTRL+SHIFT while dragging an item (Create a shortcut to the selected item)
•    F2 key (Rename the selected item)
•    CTRL+RIGHT ARROW (Move the insertion point to the beginning of the next word)
•    CTRL+LEFT ARROW (Move the insertion point to the beginning of the previous word)
•    CTRL+DOWN ARROW (Move the insertion point to the beginning of the next paragraph)
•    CTRL+UP ARROW (Move the insertion point to the beginning of the previous paragraph)
•    CTRL+SHIFT with any of the arrow keys (Highlight a block of text)
•    SHIFT with any of the arrow keys (Select more than one item in a window or on the desktop, or select text in a document)
•    CTRL+A (Select all)
•    F3 key (Search for a file or a folder)
•    ALT+ENTER (View the properties for the selected item)
•    ALT+F4 (Close the active item, or quit the active program)
•    ALT+ENTER (Display the properties of the selected object)
•    ALT+SPACEBAR (Open the shortcut menu for the active window)
•    CTRL+F4 (Close the active document in programs that enable you to have multiple documents open simultaneously)
•    ALT+TAB (Switch between the open items)
•    ALT+ESC (Cycle through items in the order that they had been opened)
•    F6 key (Cycle through the screen elements in a window or on the desktop)
•    F4 key (Display the Address bar list in My Computer or Windows Explorer)
•    SHIFT+F10 (Display the shortcut menu for the selected item)
•    ALT+SPACEBAR (Display the System menu for the active window)
•    CTRL+ESC (Display the Start menu)
•    ALT+Underlined letter in a menu name (Display the corresponding menu)
•    Underlined letter in a command name on an open menu (Perform the corresponding command)
•    F10 key (Activate the menu bar in the active program)
•    RIGHT ARROW (Open the next menu to the right, or open a submenu)
•    LEFT ARROW (Open the next menu to the left, or close a submenu)
•    F5 key (Update the active window)
•    BACKSPACE (View the folder one level up in My Computer or Windows Explorer)
•    ESC (Cancel the current task)
•    SHIFT when you insert a CD-ROM into the CD-ROM drive (Prevent the CD-ROM from automatically playing)
•    CTRL+SHIFT+ESC (Open Task Manager)

Dialog box keyboard shortcuts
If you press SHIFT+F8 in extended selection list boxes, you enable extended selection mode. In this mode, you can use an arrow key to move a cursor without changing the selection. You can press CTRL+SPACEBAR or SHIFT+SPACEBAR to adjust the selection. To cancel extended selection mode, press SHIFT+F8 again. Extended selection mode cancels itself when you move the focus to another control.
•    CTRL+TAB (Move forward through the tabs)
•    CTRL+SHIFT+TAB (Move backward through the tabs)
•    TAB (Move forward through the options)
•    SHIFT+TAB (Move backward through the options)
•    ALT+Underlined letter (Perform the corresponding command or select the corresponding option)
•    ENTER (Perform the command for the active option or button)
•    SPACEBAR (Select or clear the check box if the active option is a check box)
•    Arrow keys (Select a button if the active option is a group of option buttons)
•    F1 key (Display Help)
•    F4 key (Display the items in the active list)
•    BACKSPACE (Open a folder one level up if a folder is selected in the Save As or Open dialog box)

Microsoft natural keyboard shortcuts
•    Windows Logo (Display or hide the Start menu)
•    Windows Logo+BREAK (Display the System Properties dialog box)
•    Windows Logo+D (Display the desktop)
•    Windows Logo+M (Minimize all of the windows)
•    Windows Logo+SHIFT+M (Restore the minimized windows)
•    Windows Logo+E (Open My Computer)
•    Windows Logo+F (Search for a file or a folder)
•    CTRL+Windows Logo+F (Search for computers)
•    Windows Logo+F1 (Display Windows Help)
•    Windows Logo+ L (Lock the keyboard)
•    Windows Logo+R (Open the Run dialog box)
•    Windows Logo+U (Open Utility Manager)

Accessibility keyboard shortcuts
•    Right SHIFT for eight seconds (Switch FilterKeys either on or off)
•    Left ALT+left SHIFT+PRINT SCREEN (Switch High Contrast either on or off)
•    Left ALT+left SHIFT+NUM LOCK (Switch the MouseKeys either on or off)
•    SHIFT five times (Switch the StickyKeys either on or off)
•    NUM LOCK for five seconds (Switch the ToggleKeys either on or off)
•    Windows Logo +U (Open Utility Manager)

Windows Explorer keyboard shortcuts
•    END (Display the bottom of the active window)
•    HOME (Display the top of the active window)
•    NUM LOCK+Asterisk sign (*) (Display all of the subfolders that are under the selected folder)
•    NUM LOCK+Plus sign (+) (Display the contents of the selected folder)
•    NUM LOCK+Minus sign (-) (Collapse the selected folder)
•    LEFT ARROW (Collapse the current selection if it is expanded, or select the parent folder)
•    RIGHT ARROW (Display the current selection if it is collapsed, or select the first subfolder)

Shortcut keys for Character Map
After you double-click a character on the grid of characters, you can move through the grid by using the keyboard shortcuts:
•    RIGHT ARROW (Move to the right or to the beginning of the next line)
•    LEFT ARROW (Move to the left or to the end of the previous line)
•    UP ARROW (Move up one row)
•    DOWN ARROW (Move down one row)
•    PAGE UP (Move up one screen at a time)
•    PAGE DOWN (Move down one screen at a time)
•    HOME (Move to the beginning of the line)
•    END (Move to the end of the line)
•    CTRL+HOME (Move to the first character)
•    CTRL+END (Move to the last character)
•    SPACEBAR (Switch between Enlarged and Normal mode when a character is selected)

Microsoft Management Console (MMC) main window keyboard shortcuts
•    CTRL+O (Open a saved console)
•    CTRL+N (Open a new console)
•    CTRL+S (Save the open console)
•    CTRL+M (Add or remove a console item)
•    CTRL+W (Open a new window)
•    F5 key (Update the content of all console windows)
•    ALT+SPACEBAR (Display the MMC window menu)
•    ALT+F4 (Close the console)
•    ALT+A (Display the Action menu)
•    ALT+V (Display the View menu)
•    ALT+F (Display the File menu)
•    ALT+O (Display the Favorites menu)

MMC console window keyboard shortcuts
•    CTRL+P (Print the current page or active pane)
•    ALT+Minus sign (-) (Display the window menu for the active console window)
•    SHIFT+F10 (Display the Action shortcut menu for the selected item)
•    F1 key (Open the Help topic, if any, for the selected item)
•    F5 key (Update the content of all console windows)
•    CTRL+F10 (Maximize the active console window)
•    CTRL+F5 (Restore the active console window)
•    ALT+ENTER (Display the Properties dialog box, if any, for the selected item)
•    F2 key (Rename the selected item)
•    CTRL+F4 (Close the active console window. When a console has only one console window, this shortcut closes the console)

Remote desktop connection navigation
•    CTRL+ALT+END (Open the Microsoft Windows NT Security dialog box)
•    ALT+PAGE UP (Switch between programs from left to right)
•    ALT+PAGE DOWN (Switch between programs from right to left)
•    ALT+INSERT (Cycle through the programs in most recently used order)
•    ALT+HOME (Display the Start menu)
•    CTRL+ALT+BREAK (Switch the client computer between a window and a full screen)
•    ALT+DELETE (Display the Windows menu)
•    CTRL+ALT+Minus sign (-) (Place a snapshot of the entire client window area on the Terminal server clipboard and provide the same functionality as pressing ALT+PRINT SCREEN on a local computer.)
•    CTRL+ALT+Plus sign (+) (Place a snapshot of the active window in the client on the Terminal server clipboard and provide the same functionality as pressing PRINT SCREEN on a local computer.)

Microsoft Internet Explorer navigation
•    CTRL+B (Open the Organize Favorites dialog box)
•    CTRL+E (Open the Search bar)
•    CTRL+F (Start the Find utility)
•    CTRL+H (Open the History bar)
•    CTRL+I (Open the Favorites bar)
•    CTRL+L (Open the Open dialog box)
•    CTRL+N (Start another instance of the browser with the same Web address)
•    CTRL+O (Open the Open dialog box, the same as CTRL+L)
•    CTRL+P (Open the Print dialog box)
•    CTRL+R (Update the current Web page)
•    CTRL+W (Close the current window)

Windows Explorer tree control
•    Numeric Keypad *: Expands everything under the current selection
•    Numeric Keypad +: Expands the current selection
•    Numeric Keypad -: Collapses the current selection.
•    RIGHT ARROW: Expands the current selection if it is not expanded, otherwise goes to the first child
•    LEFT ARROW: Collapses the current selection if it is expanded, otherwise goes to the parent

Properties control
•    CTRL+TAB/CTRL+SHIFT+TAB: Move through the property tabs

Accessibility shortcuts
•    Press SHIFT five times: Toggles StickyKeys on and off
•    Press down and hold the right SHIFT key for eight seconds: Toggles FilterKeys on and off
•    Press down and hold the NUM LOCK key for five seconds: Toggles ToggleKeys on and off
•    Left ALT+left SHIFT+NUM LOCK: Toggles MouseKeys on and off
•    Left ALT+left SHIFT+PRINT SCREEN: Toggles high contrast on and off