May the source be with you, but remember the KISS principle ;-)
Home Switchboard Unix Administration Red Hat TCP/IP Networks Neoliberalism Toxic Managers
(slightly skeptical) Educational society promoting "Back to basics" movement against IT overcomplexity and  bastardization of classic Unix

AutoHotkey Basics

News Windows Keyboard and Mouse Utilities Recommended Links Programmable Keyboards Microsoft IntelliType AutoHotkey
Clipboard managers ArsClip Expect Mousekeys Teraterm TeraTerm Macros
Techniques for 'driving' Windows applications Microsoft Windows shortcuts Keyboard remapping How to pipe text from shell to windows cut and paste buffer Humor Etc

Autohotkey is an interesting and pretty capable application. The only complain I have that it has some bugs. 
In  case you have a telnet session to the target, you can also use Teraterm  macro capabilities.  See TeraTerm Macros.

AutoHotkey is a free, open-source macro-creation and automation software utility that allows users to automate repetitive tasks. It has a custom scripting language that is aimed specifically at providing keyboard shortcuts or hotkeys.


This script swaps control and alt keys.


The following script will allow a user to search for a particular word or phrase using Google. After copying text from any application to the Clipboard, pressing the configurable hotkey ⊞ Win+g will open the user's default web browser and perform the search.

#g:: ; Win+g

The following is an example of the script required to create the hotstring "afaik," which is automatically replaced by "as far as I know":

::afaik::as far as I know

The following is an example of a simple function in AutoHotkey. When a URL is copied to the Clipboard, the hotkey Alt+x will check the URL for any/all parenthesis and replace them with alternate characters before pasting the URL from the Clipboard:

!x:: ; Alt+x
   Send ^v ; Ctrl+v

URLReplace() {
   StringReplace, Clipboard, Clipboard, (, `%28, All
   StringReplace, Clipboard, Clipboard, ), `%29, All

In this example, once the contents of a user name or IP Address link have been copied from anywhere on Wikipedia's site to the Clipboard (using Firefox), the following script allows a user to perform the function CopyUser on the Clipboard's contents and save it to a variable designated by either the hotkey Ctrl+⇧ Shift+W or the hotkey Ctrl+⇧ Shift+E. The hotkey Ctrl+⇧ Shift+R utilizes the resultant variables to produce a revert edits summary.

^+w::last := CopyUser() ; Ctrl+Shift+w
^+e::edit := CopyUser() ; Ctrl+Shift+e

CopyUser() {
   Clipboard =
   StringReplace, Clipboard, Clipboard,
   StringReplace, Clipboard, Clipboard, wiki/
   StringReplace, Clipboard, Clipboard, w/index.php?title=
   StringReplace, Clipboard, Clipboard, Special:Contributions&target=
   StringReplace, Clipboard, Clipboard, User:
   StringReplace, Clipboard, Clipboard, &action=edit
   StringReplace, Clipboard, Clipboard, _, %A_Space%, All
   Return, Clipboard

; Ctrl+Shift+r
^+r::Send revert edits by [[Special:Contributions/%edit%|%edit%]] to last version by %last%

More examples of what can be done with AutoHotkey can be found in the Scripts and Functions section of AutoHotkey's online forum. Many of these scripts have also have been placed into an AutoHotkey wiki based on the purpose of the script.

# -- WinKey
; assign a hotkey to launch a app
#n::Run Notepad     ; this means the Win+n
!n::Run Notepad     ; this means Alt+n
^n::Run Notepad     ; this means Ctrl+n

F6::Run Notepad     ; F6
^F6::Run Notepad    ; Ctrl+F6
^!n::Run Notepad    ; Ctrl+Alt+n

Symbol Description
# Win (Windows logo key). In v1.0.48.01+, for Windows Vista and later, hotkeys that include the Windows key (e.g. #a) will wait for the Windows key to be released before sending any text containing an "L" keystroke. This prevents the Send within such a hotkey from locking the PC. This behavior applies to all sending modes except SendPlay (which doesn't need it) and blind mode.
! Alt
^ Control
+ Shift
& An ampersand may be used between any two keys or mouse buttons to combine them into a custom hotkey. See below for details. Such hotkeys are ignored (not activated) on Windows 95/98/Me.
< Use the left key of the pair. e.g. <!a is the same as !a except that only the left Alt key will trigger it. This symbol is ignored on Windows 95/98/ME.
> Use the right key of the pair. This symbol is ignored on Windows 95/98/ME.
<^>! AltGr (alternate graving). If your keyboard layout has an AltGr key instead of a right-Alt key, this series of symbols can usually be used to stand for AltGr. For example:
<^>!m::MsgBox You pressed AltGr+m.
<^<!m::MsgBox You pressed LeftControl+LeftAlt+m.

Alternatively, to make AltGr itself into a hotkey, use the following hotkey (without any hotkeys like the above present):

LControl & RAlt::MsgBox You pressed AltGr itself.
* Wildcard: Fire the hotkey even if extra modifiers are being held down. This is often used in conjunction with remapping keys or buttons. For example:
*#c::Run Calc.exe  ; Win+C, Shift+Win+C, Ctrl+Win+C, etc. will all trigger this hotkey.
*ScrollLock::Run Notepad  ; Pressing Scrolllock will trigger this hotkey even when modifer key(s) are down.
~ When the hotkey fires, its key's native function will not be blocked (hidden from the system). In both of the below examples, the user's click of the mouse button will be sent to the active window:
~RButton::MsgBox You clicked the right mouse button.
~RButton & C::MsgBox You pressed C while holding down the right mouse button.

Notes: 1) Unlike the other prefix symbols, the tilde prefix is allowed to be present on some of a hotkey's variants but absent on others; 2) Special hotkeys that are substitutes for alt-tab always ignore the tilde prefix; 3) The tilde prefix is ignored on Windows 95/98/ME

$ This is usually only necessary if the script uses the Send command to send the keys that comprise the hotkey itself, which might otherwise cause it to trigger itself. The exact behavior of the $ prefix varies depending on operating system:

On Windows NT4/2k/XP or later: The $ prefix forces the keyboard hook to be used to implement this hotkey, which as a side-effect prevents the Send command from triggering it. The $ prefix is equivalent to having specified #UseHook somewhere above the definition of this hotkey.

On Windows 95/98/Me: The hotkey is disabled during the execution of its thread and re-enabled afterward. As a side-effect, if #MaxThreadsPerHotkey is set higher than 1, it will behave as though set to 1 for such hotkeys.

The word UP may follow the name of a hotkey to cause the hotkey to fire upon release of the key rather than when the key is pressed down. The following example remaps LWin to become LControl:

*LWin::Send {LControl Down}
*LWin Up::Send {LControl Up}

"Up" can also be used with normal hotkeys as in this example: ^!r Up::MsgBox You pressed and released Ctrl+Alt+R. It also works with combination hotkeys (e.g. F1 & e Up::)

Limitations: 1) "Up" does not work with joystick buttons; 2) "Up" requires Windows NT4/2000/XP or later; and 3) An "Up" hotkey without a normal/down counterpart hotkey will completely take over that key to prevent it from getting stuck down. One way to prevent this is to add a tilde prefix (e.g. ~LControl up::)

On a related note, a technique similar to the above is to make a hotkey into a prefix key. The advantage is that although the hotkey will fire upon release, it will do so only if you did not press any other key while it was held down. For example:

LControl & F1::return  ; Make left-control a prefix by using it in front of "&" at least once.
LControl::MsgBox You released LControl without having used it to modify any other key.

(See the Key List for a complete list of keyboard keys and mouse/joystick buttons)

Multiple hotkeys can be stacked vertically to have them perform the same action. For example:

MsgBox Pressing either Control+Numpad0 or Control+Numpad1 will display this message.

A key or key-combination can be disabled for the entire system by having it do nothing. The following example disables the right-side Windows key:


Context-sensitive Hotkeys

The directives #IfWinActive/Exist can be used to make a hotkey perform a different action (or none at all) depending on the type of window that is active or exists. For example:

#IfWinActive, ahk_class Notepad
^a::MsgBox You pressed Ctrl-A while Notepad is active. Pressing Ctrl-A in any other window will pass the Ctrl-A keystroke to that window.
#c::MsgBox You pressed Win-C while Notepad is active.
#c::MsgBox You pressed Win-C while any window except Notepad is active.

Custom Combinations and Other Features [Windows NT/2000/XP or later]

You can define a custom combination of two keys (except joystick buttons) by using " & " between them. In the below example, you would hold down Numpad0 then press the second key to trigger the hotkey:

Numpad0 & Numpad1::MsgBox You pressed Numpad1 while holding down Numpad0.
Numpad0 & Numpad2::Run Notepad

In the above example, Numpad0 becomes a prefix key; but this also causes Numpad0 to lose its original/native function when it is pressed by itself. To avoid this, a script may configure Numpad0 to perform a new action such as one of the following:

Numpad0::WinMaximize A   ; Maximize the active/foreground window.
Numpad0::Send {Numpad0}  ; Make the release of Numpad0 produce a Numpad0 keystroke. See comment below.

The presence of one of the above hotkeys causes the release of Numpad0 to perform the indicated action, but only if you did not press any other keys while Numpad0 was being held down.

Numlock, Capslock, and Scrolllock: These keys may be forced to be "AlwaysOn" or "AlwaysOff". For example: SetNumlockState AlwaysOn

Overriding Explorer's hotkeys: Windows' built-in hotkeys such as Win-E (#e) and Win-R (#r) can be individually overridden simply by assigning them to an action in the script. See the override page for details.

Substitutes for Alt-Tab: Hotkeys can provide an alternate means of alt-tabbing. For example, the following two hotkeys allow you to alt-tab with your right hand:

RControl & RShift::AltTab  ; Hold down right-control then press right-shift repeatedly to move forward.
RControl & Enter::ShiftAltTab  ; Without even having to release right-control, press Enter to reverse direction.

For more details, see Alt-Tab.

Mouse Wheel Hotkeys [Windows NT/2000/XP or later]

Hotkeys that fire upon turning the mouse wheel are supported via the key names WheelDown and WheelUp. WheelLeft and WheelRight are also supported in v1.0.48+, but have no effect on operating systems older than Windows Vista. Here are some examples of mouse wheel hotkeys:

MButton & WheelDown::MsgBox You turned the mouse wheel down while holding down the middle button.
^!WheelUp::MsgBox You rotated the wheel up while holding down Control+Alt.

In v1.0.43.03+, the built-in variable A_EventInfo contains the amount by which the wheel was turned, which is typically 1. However, A_EventInfo can be greater or less than 1 under the following circumstances:

Some of the most useful hotkeys for the mouse wheel involve alternate modes of scrolling a window's text. For example, the following pair of hotkeys scrolls horizontally instead of vertically when you turn the wheel while holding down the left Control key:

~LControl & WheelUp::  ; Scroll left.
ControlGetFocus, fcontrol, A
Loop 2  ; <-- Increase this value to scroll faster.
    SendMessage, 0x114, 0, 0, %fcontrol%, A  ; 0x114 is WM_HSCROLL and the 0 after it is SB_LINELEFT.

~LControl & WheelDown::  ; Scroll right.
ControlGetFocus, fcontrol, A
Loop 2  ; <-- Increase this value to scroll faster.
    SendMessage, 0x114, 1, 0, %fcontrol%, A  ; 0x114 is WM_HSCROLL and the 1 after it is SB_LINERIGHT.

Finally, since mouse wheel hotkeys generate only down-events (never up-events), they cannot be used as key-up hotkeys.

Hotkey Tips and Remarks

Each numpad key can be made to launch two different hotkey subroutines depending on the state of Numlock. Alternatively, a numpad key can be made to launch the same subroutine regardless of the Numlock state. For example:

MsgBox, This hotkey is launched regardless of whether Numlock is on.

If the tilde (~) operator is used with a prefix key even once, that prefix will always be sent through to the active window. For example, in both of the below hotkeys, the active window will receive all right-clicks even though only one of the definitions contains a tilde:

 ~RButton & LButton::MsgBox You pressed the left mouse button while holding down the right.
RButton & WheelUp::MsgBox You turned the mouse wheel up while holding down the right button.

The Suspend command can temporarily disable all hotkeys except for ones you make exempt. For greater selectivity, use #IfWinActive/Exist.

By means of the Hotkey command, hotkeys can be created dynamically while the script is running. The Hotkey command can also modify, disable, or enable the script's existing hotkeys individually.

Joystick hotkeys do not currently support modifier prefixes such as ^ (Control) and # (Win). However, you can use GetKeyState to mimic this effect as shown in the following example:

if not GetKeyState("Control")  ; Neither the left nor right Control key is down.
    return  ; i.e. Do nothing.
MsgBox You pressed the first joystick's second button while holding down the Control key.

There may be times when a hotkey should wait for its own modifier keys to be released before continuing. Consider the following example:

^!s::Send {Delete}

Pressing Control-Alt-S would cause the system to behave as though you pressed Control-Alt-Delete (due to the system's aggressive detection of Ctrl-Alt-Delete). To work around this, use KeyWait to wait for the keys to be released; for example:

KeyWait Control
KeyWait Alt
Send {Delete}

If a hotkey label like #z:: produces an error like "Invalid Hotkey", your system's keyboard layout/language might not have the specified character ("Z" in this case). Try using a different character that you know exists in your keyboard layout.

A hotkey label can be used as the target of a Gosub or Goto. For example: Gosub ^!s

One common use for hotkeys is to start and stop a repeating action, such as a series of keystrokes or mouse clicks. For an example of this, see this FAQ topic.

Finally, each script is quasi multi-threaded, which allows a new hotkey to be launched even when a previous hotkey subroutine is still running. For example, new hotkeys can be launched even while a MsgBox is being displayed by the current hotkey.

Alt-Tab Hotkeys

Each Alt-Tab hotkey must be a combination of two keys, which is typically achieved via the ampersand symbol (&). In the following example, you would hold down the right Alt key and press J or K to navigate the alt-tab menu:

RAlt & j::AltTab
RAlt & k::ShiftAltTab

AltTab and ShiftAltTab are two of the special commands that are only recognized when used on the same line as a hotkey. Here is the complete list:

AltTab: If the alt-tab menu is visible, move forward in it. Otherwise, display the menu (only if the hotkey is an "&" combination of two keys; otherwise, it does nothing).

ShiftAltTab: Same as above except move backward in the menu.

AltTabAndMenu: If the alt-tab menu is visble, move forward in it. Otherwise, display the menu.

AltTabMenuDismiss: Close the Alt-tab menu.

To illustrate the above, the mouse wheel can be made into an entire substitute for Alt-tab. With the following hotkeys in effect, clicking the middle button displays the menu and turning the wheel navigates through it:


To cancel a hotkey-invoked Alt-tab menu without activating the selected window, use a hotkey such as the following. It might require adjustment depending on: 1) the means by which the alt-tab menu was originally displayed; and 2) whether the script has the keyboard hook installed.

LCtrl & CapsLock::AltTab
!MButton::  ; Middle mouse button. The ! prefix makes it fire while the Alt key is down (which it is if the alt-tab menu is visible).
IfWinExist ahk_class #32771  ; Indicates that the alt-tab menu is present on the screen.
    Send !{Escape}{Alt up}

Currently, all special Alt-tab actions must be assigned directly to a hotkey as in the examples above (i.e. they cannot be used as though they were commands). Also, the presence of the alt-tab menu can be detected via IfWinExist ahk_class #32771

Custom alt-tab actions can also be created via hotkeys. In the following example, you would press F1 to display the menu and advance forward in it. Then you would press F2 to activate the selected window (or press Escape to cancel):

*F1::Send {Alt down}{tab} ; Asterisk is required in this case.
!F2::Send {Alt up}  ; Release the Alt key, which activates the selected window.
IfWinExist ahk_class #32771
    Send {Escape}{Alt up}  ; Cancel the menu without activating the selected window.

AutoHotkey language is not case sensitive. 「Run」 is the same as 「run」.

Once you run the above script, it actually stays running as a background process. You can see it in your Taskbar's notification area. You can right click on the icon and pull a menu to exit the script. As long as the script is running, your hotkey is available to you.

Defining Hotkeys to Launch Apps or Open File

Some examples of launching applications, opening files, url.

; you can use "Run" to launch apps or url
Run Notepad       ; launch a app by name
Run "C:\Program Files (x86)\Internet Explorer\iexplore.exe" ; launch a app by path

Run C:\Users\xah\Documents\todo.txt ; launch a file
Run C:\Users\xah\Documents ; launch a folder

Run    ; launch a url in default browser
; launching a app with a parameter
Run "C:\Program Files (x86)\emacs-23.1-bin-i386\emacs-23.1\bin\emacs.exe" "-Q"

Assign a Key to Launch a App

; assign a hotkey to launch a app
#n::Run Notepad     ; this means the Win+n
!n::Run Notepad     ; this means Alt+n
^n::Run Notepad     ; this means Ctrl+n

F6::Run Notepad     ; F6
^F6::Run Notepad    ; Ctrl+F6
^!n::Run Notepad    ; Ctrl+Alt+n

The above should be all you need. If you need to define keys such as Home, End, PageUp, ScrLk, numberpad keys... and special keys such as Browser Back, Browser Forward, Play/Pause ..., see: AutoHotkey Key Notations.

Sending Text and Keystrokes

You can define a hotkey, so that, when pressed, it sends some other typing or keystrokes.

; pressing Ctrl+Alt+s to insert your signature
Send Best,{Enter}{Enter} Mary Jane

In the above, the 「{Enter}」 means the Enter key. When you press 【Ctrl+Alt+s】, then it'll type:


 Mary Jane  

Simple Useful AutoHotkey Examples

For about 20 simple and useful scripts, see: AutoHotkey Example Scripts.

Start AutoHotkey when Computer Starts

When you have a lot of hotkeys defined, everytime you restart your computer, you have to start your ahk script, otherwise the hotkeys won't be available. You can make Windows automatically start your script when system starts. Here's how.

Suppose your script is named 〔MyHotkeys.ahk〕. Open the folder

C:\Users\xah\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

Now, hold down Alt and drag your 〔MyHotkeys.ahk〕 file to the folder. This will create a link shortcut to your Startup folder. When Windows starts, your script will also automatically start.

For about 20 simple and useful scripts, see: AutoHotkey Example Scripts.

Start AutoHotkey when Computer Starts

When you have a lot of hotkeys defined, everytime you restart your computer, you have to start your ahk script, otherwise the hotkeys won't be available. You can make Windows automatically start your script when system starts. Here's how.

Suppose your script is named 〔MyHotkeys.ahk〕. Open the folder

C:\Users\xah\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

Now, hold down Alt and drag your 〔MyHotkeys.ahk〕 file to the folder. This will creat a link shortcut to your Startup folder. When Windows starts, your script will also automatically start.

Top updates

Bulletin Latest Past week Past month
Google Search


Old News ;-)

[Nov 25, 2007] AutoHotkey - Free Mouse and Keyboard Macro Program with Hotkeys and AutoText Nice addition to windows.

AutoHotkey is a free, open-source utility for Windows. With it, you can:

Getting started might be easier than you think. Check out the quick-start tutorial.

More About Hotkeys

AutoHotkey unleashes the full potential of your keyboard, joystick, and mouse. For example, in addition to the typical Control, Alt, and Shift modifiers, you can use the Windows key and the Capslock key as modifiers. In fact, you can make any key or mouse button act as a modifier. For these and other capabilities, see Advanced Hotkeys.

Other Features

License: GNU General Public License

Recommended Links

Comparison of macro recorder software - Wikipedia, the free encyclopedia

AutoHotkey - Free Mouse and Keyboard Macro Program with Hotkeys and AutoText.

Top Visited

Bulletin Latest Past week Past month
Google Search



Groupthink : Two Party System as Polyarchy : Corruption of Regulators : Bureaucracies : Understanding Micromanagers and Control Freaks : Toxic Managers :   Harvard Mafia : Diplomatic Communication : Surviving a Bad Performance Review : Insufficient Retirement Funds as Immanent Problem of Neoliberal Regime : PseudoScience : Who Rules America : Neoliberalism  : The Iron Law of Oligarchy : Libertarian Philosophy


War and Peace : Skeptical Finance : John Kenneth Galbraith :Talleyrand : Oscar Wilde : Otto Von Bismarck : Keynes : George Carlin : Skeptics : Propaganda  : SE quotes : Language Design and Programming Quotes : Random IT-related quotesSomerset Maugham : Marcus Aurelius : Kurt Vonnegut : Eric Hoffer : Winston Churchill : Napoleon Bonaparte : Ambrose BierceBernard Shaw : Mark Twain Quotes


Vol 25, No.12 (December, 2013) Rational Fools vs. Efficient Crooks The efficient markets hypothesis : Political Skeptic Bulletin, 2013 : Unemployment Bulletin, 2010 :  Vol 23, No.10 (October, 2011) An observation about corporate security departments : Slightly Skeptical Euromaydan Chronicles, June 2014 : Greenspan legacy bulletin, 2008 : Vol 25, No.10 (October, 2013) Cryptolocker Trojan (Win32/Crilock.A) : Vol 25, No.08 (August, 2013) Cloud providers as intelligence collection hubs : Financial Humor Bulletin, 2010 : Inequality Bulletin, 2009 : Financial Humor Bulletin, 2008 : Copyleft Problems Bulletin, 2004 : Financial Humor Bulletin, 2011 : Energy Bulletin, 2010 : Malware Protection Bulletin, 2010 : Vol 26, No.1 (January, 2013) Object-Oriented Cult : Political Skeptic Bulletin, 2011 : Vol 23, No.11 (November, 2011) Softpanorama classification of sysadmin horror stories : Vol 25, No.05 (May, 2013) Corporate bullshit as a communication method  : Vol 25, No.06 (June, 2013) A Note on the Relationship of Brooks Law and Conway Law


Fifty glorious years (1950-2000): the triumph of the US computer engineering : Donald Knuth : TAoCP and its Influence of Computer Science : Richard Stallman : Linus Torvalds  : Larry Wall  : John K. Ousterhout : CTSS : Multix OS Unix History : Unix shell history : VI editor : History of pipes concept : Solaris : MS DOSProgramming Languages History : PL/1 : Simula 67 : C : History of GCC developmentScripting Languages : Perl history   : OS History : Mail : DNS : SSH : CPU Instruction Sets : SPARC systems 1987-2006 : Norton Commander : Norton Utilities : Norton Ghost : Frontpage history : Malware Defense History : GNU Screen : OSS early history

Classic books:

The Peter Principle : Parkinson Law : 1984 : The Mythical Man-MonthHow to Solve It by George Polya : The Art of Computer Programming : The Elements of Programming Style : The Unix Haterís Handbook : The Jargon file : The True Believer : Programming Pearls : The Good Soldier Svejk : The Power Elite

Most popular humor pages:

Manifest of the Softpanorama IT Slacker Society : Ten Commandments of the IT Slackers Society : Computer Humor Collection : BSD Logo Story : The Cuckoo's Egg : IT Slang : C++ Humor : ARE YOU A BBS ADDICT? : The Perl Purity Test : Object oriented programmers of all nations : Financial Humor : Financial Humor Bulletin, 2008 : Financial Humor Bulletin, 2010 : The Most Comprehensive Collection of Editor-related Humor : Programming Language Humor : Goldman Sachs related humor : Greenspan humor : C Humor : Scripting Humor : Real Programmers Humor : Web Humor : GPL-related Humor : OFM Humor : Politically Incorrect Humor : IDS Humor : "Linux Sucks" Humor : Russian Musical Humor : Best Russian Programmer Humor : Microsoft plans to buy Catholic Church : Richard Stallman Related Humor : Admin Humor : Perl-related Humor : Linus Torvalds Related humor : PseudoScience Related Humor : Networking Humor : Shell Humor : Financial Humor Bulletin, 2011 : Financial Humor Bulletin, 2012 : Financial Humor Bulletin, 2013 : Java Humor : Software Engineering Humor : Sun Solaris Related Humor : Education Humor : IBM Humor : Assembler-related Humor : VIM Humor : Computer Viruses Humor : Bright tomorrow is rescheduled to a day after tomorrow : Classic Computer Humor

The Last but not Least Technology is dominated by two types of people: those who understand what they do not manage and those who manage what they do not understand ~Archibald Putt. Ph.D

Copyright © 1996-2021 by Softpanorama Society. was initially created as a service to the (now defunct) UN Sustainable Development Networking Programme (SDNP) without any remuneration. This document is an industrial compilation designed and created exclusively for educational use and is distributed under the Softpanorama Content License. Original materials copyright belong to respective owners. Quotes are made for educational purposes only in compliance with the fair use doctrine.

FAIR USE NOTICE This site contains copyrighted material the use of which has not always been specifically authorized by the copyright owner. We are making such material available to advance understanding of computer science, IT technology, economic, scientific, and social issues. We believe this constitutes a 'fair use' of any such copyrighted material as provided by section 107 of the US Copyright Law according to which such material can be distributed without profit exclusively for research and educational purposes.

This is a Spartan WHYFF (We Help You For Free) site written by people for whom English is not a native language. Grammar and spelling errors should be expected. The site contain some broken links as it develops like a living tree...

You can use PayPal to to buy a cup of coffee for authors of this site


The statements, views and opinions presented on this web page are those of the author (or referenced source) and are not endorsed by, nor do they necessarily reflect, the opinions of the Softpanorama society. We do not warrant the correctness of the information provided or its fitness for any purpose. The site uses AdSense so you need to be aware of Google privacy policy. You you do not want to be tracked by Google please disable Javascript for this site. This site is perfectly usable without Javascript.

Last modified: March, 12, 2019