Key Capture Software

This page and the accompanying software were written by William Soukoreff and Scott MacKenzie.


This is the homepage for the KeyCapture software. KeyCapture is a tool for usability professionals, researchers, and teachers, that that makes it possible to observe the keystrokes and mouse actions performed by a user of the windows operating system. Ever wonder: What editing keys are really used when entering text? How much time does a typical user spend using the mouse, as opposed to entering text? Or, What applications does a user use, and for how long? KeyCapture can answer these questions.

The KeyCapture software has been released under the GNU Public Licence, and is available for free download from this webpage. As such, KeyCapture will also be of interest to programmers looking for examples of windows programming using:

The most recent version of KeyCapture is 1.3, released July 18, 2003.


The KeyCapture software was first announced in one of our publications:

R. W. Soukoreff, & I. S. MacKenzie (2003). Input-based language modelling in the design of high performance text input techniques Proceedings of Graphics Interface 2003, 89-96.

The idea is that text input researchers create language models that they use to design and evaluate novel text input methods. There are lots of people involved in this area of research (see the links provided below). The problem is that researchers often limit themselves to using freely available text databases called corpora, instead of building models using data captured during the text entry task.

Although the usage of corpora is appropriate in some situations, from a text-input perspective, there are three general weaknesses with this approach. (For elaboration on these points, please see the paper mentioned above.)

  1. Users' language is typically quite different from that appearing in any corpus.
  2. Current corpora do not reflect the editing process used in their creation.
  3. Corpora do not capture the input modalities of text input devices.

In order to observe the text that people typically enter, and how the text is entered, we constructed the KeyCapture software. This is a collection of programs that can be used to record every keystroke and mouse movement made by somebody using a computer equipped with the windows operating system.

The Software

This software is Copyright (c) 2003, by William Soukoreff and Scott MacKenzie. This software has been released under the GNU General Public Licence.

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.

The text of the GNU General Public Licence is available here.

Latest Executables (Version 1.3)


The Source Code

This source code was created using microsoft's visual C++ (version 5.0) programming environment. You'll need VC++ to compile these programs.

Version 1.3 (current) KeyCapture.20030718.Zip
This version fixes a bug involving clearing the data or saving the data file, followed by disabling and enabling KeyCapture (using the checkbox in the main dialog box of KeyCapture_Config.exe). A couple of small clean-ups were made as well. (Thanks to Mark Richman for helping me to debug this issue.)

Version 1.2 (old) KeyCapture.20030703.Zip
This version saw several invasive changes to the code to properly support windows XP. Most of the fixes had to do with concurrency, and the shared memory functions. A progress bar was added to the save function. The KeyCapture_Suspend program was created to address privacy concerns. The setup dialog box in the config program was improved.

A really old version of the source code (Version 1.1) is available too (KeyCapture.20030623.Zip). This old version is the software that was used in the paper referenced at the top of this webpage. I do not recommend using this old software - the latest version is much improved.


Installation is easy. Just copy the programs (KeyCapture_Config.exe, KeyCapture_Suspend.exe, KeyCapture.exe, and KeyCapture.dll) into any directory. Then, run the config program. Once the config program has started, click on "Setup" and select the data you want recorded. Once KeyCapture has been configured, the config program can be removed.

The KeyCapture program will introduce a couple of entries into the system registry to record the configuration settings, and to ensure that KeyCapture is started automatically when the computer is rebooted. Once the memory buffer within KeyCapture becomes full, it will create a file called "AutoSave.KC" in the same directory as the .dll program. Do not delete this file - this is your data stored in an efficient binary representation. If you want to move KeyCapture to another directory, see The Registry and Moving the Executables below.

As users use the computer, their actions will be recorded. At some point later, run the config program again to retrieve the data recorded by KeyCapture. (With the config program running, click on "Save Data" to retreive your data.)

Uninstalling and Removing

To uninstall KeyCapture from your system:
  1. Run KeyCapture_Config, and click on "Uninstall". This removes all of the KeyCapture keys from the windows registry. (For more information on what KeyCapture stores in the registry see The Registry, and Moving the Executables below.)

  2. Delete the executables (KeyCapture.exe, KeyCapture.dll, KeyCapture_Config.exe, and KeyCapture_Suspend.exe).
A file named AutoSave.KC may be found in the same directory as the KeyCapture executables. After uninstalling KeyCapture using the instructions above, this file may be deleted. Similarly, there may be a file called c:\windows\temp\KeyCaptureEmergencySaveFile that can be deleted after uninstalling KeyCapture.

The Registry, and Moving the Executables

The first time that the KeyCapture_Config program is run, it adds some records to the system registry. If KeyCapture is enabled, an entry is added to the registry in:


This registry entry causes KeyCapture to be automatically started when the computer boots. Additionally, KeyCapture creates several entries under:


Note that there is an easy way to remove all of the KeyCapture-related keys from the registry. Simply start the config program and click on "Uninstall". You may want to do this if you want to completely remove KeyCapture from your computer, or, if you need to move KeyCapture to another directory after it has been installed. To move the KeyCapture files to another directory, you will have to change the InstalledPath entry under the registry key listed above. The easiest way to do this is to run the config program and click on the "Uninstall" button. Then move the executables, and then run the configuration program again. This will cause KeyCapture to recreate the necessary keys in the registry including the correct InstalledPath key.

How it Works

The KeyCapture software takes advantage of several low-level hooks in the windows operating system. KeyCapture connects to these hooks to receive each key press, key release, and mouse action, before the programs running in windows see them. The KeyCapture software is designed to run in the background, so the user is not disturbed by the keystroke observation process (i.e., there is no window open, and no little icon in the system tray to indicate that KeyCapture is operating).

KeyCapture consists of four programs:

KeyCapture.exe and KeyCapture.dll
The real work is done by the KeyCapture.dll program. It is this library that connects to the hooks in windows and records the data. The KeyCapture.exe program is simply used to load the .dll, and to keep it resident in memory. You should never run or terminate the KeyCapture.exe program - starting and stopping this program is done via the KeyCapture_Config program described below.

KeyCapture_Config provides a friendly configuration screen. This allows the experimenter to indicate what data they are interested in, and how it should be recorded. The KeyCapture_Config program is also used to retreive your data. After KeyCapture has been running on a system for a while (so it has captured some data) run the KeyCapture_Config program and click on "Save Data". This opens a dialogue box by which you can save an ASCII file of your data. A sample data file appears below.

Starting and stopping the KeyCapture.exe program is accomplished by running KeyCapture_Config, and checking or unchecking the checkbox labeled "Enable KeyCapture".

Because the KeyCapture_Config program is only used for configuration, it can be removed from the system once the other two programs (KeyCapture.dll, and KeyCapture.exe) have been configured. (It is a good thing to remove the config program when you're not using it so users can't change the configuration settings or delete the data.)

The KeyCapture_Suspend program is used to temporarily disable the capturing of keystrokes and mouse actions, when the operator of the computer needs privacy. Using KeyCapture_Suspend is easy, when the suspend program is running, KeyCapture is suspended. So, just before typing a password or any confidential data, have your subjects start the suspend program; when they're finished, they should close the program.

The Config Screens

Here's what the main KeyCapture_Config screens look like...

and after clicking on "Setup" the config screen appears...

The Data File

Below appears an excerpt from a sample data file. The whole data file is available here.

You can see that the user changes to microsoft word (line 370), and types "This is a little text entered to demonstrate the KeyCapture program!". The data file contains a description of every event it recorded, as well as the date and time with millisecond accuracy, and any extra information (e.g. mouse location, or key-down versus key-up) that windows provides.

# KeyCapture keystroke data file
# Version:        1.0
# Subject:        NoSubjectName
# Filename:       C:\Documents and Settings\will\Desktop\KeyCapture (Latest Executables)\NoSubjectName20030609-120921-698.txt
# NumberOfEvents: 760

001 GeneralMessage Version(1.1) Subject(NoSubjectName)
002 TimeMessage 20030609-120921-698 Counter(827479750370) Frequency(3579545Hz) Correction(0ms)
003 Mouse       20030609-120921-709 "LBUTTONUP" ID(0x202) x(155) y(207)
004 WindowFocusChange C:\WINDOWS\System32\BROWSEUI.dll
005 Mouse       20030609-120935-352 "MOUSEMOVE" ID(0x200) x(755) y(656)
006 Mouse       20030609-120935-457 "MOUSEMOVE" ID(0x200) x(755) y(656)
368 Mouse       20030609-120941-477 "MOUSEMOVE" ID(0x200) x(720) y(1186)
369 Mouse       20030609-120941-735 "MOUSEMOVE" ID(0x200) x(715) y(1074)
370 WindowFocusChange C:\Program Files\Microsoft Office\Office10\WINWORD.EXE
371 Mouse       20030609-120941-817 "MOUSEMOVE" ID(0x200) x(732) y(972)
372 Mouse       20030609-120941-818 "MOUSEMOVE" ID(0x200) x(733) y(960)
393 Mouse       20030609-120942-016 "MOUSEMOVE" ID(0x200) x(694) y(751)
394 Mouse       20030609-120942-026 "MOUSEMOVE" ID(0x200) x(694) y(750)
395 KeyPress    20030609-120943-774 "SHIFT" Status=(down) Key(16) Extra(0x2a)
396 KeyPress    20030609-120943-963 "T" Status=(down) Key(84) Extra(0x14)
397 KeyPress    20030609-120944-025 "T" Status=(up) Key(84) Extra(0xc014)
398 KeyPress    20030609-120944-051 "SHIFT" Status=(up) Key(16) Extra(0xc02a)
399 KeyPress    20030609-120944-210 "H" Status=(down) Key(72) Extra(0x23)
400 KeyPress    20030609-120944-294 "H" Status=(up) Key(72) Extra(0xc023)
401 KeyPress    20030609-120944-412 "I" Status=(down) Key(73) Extra(0x17)
402 KeyPress    20030609-120944-482 "I" Status=(up) Key(73) Extra(0xc017)
403 KeyPress    20030609-120944-512 "S" Status=(down) Key(83) Extra(0x1f)
404 KeyPress    20030609-120944-586 "S" Status=(up) Key(83) Extra(0xc01f)
405 KeyPress    20030609-120944-622 "SPACE" Status=(down) Key(32) Extra(0x39)
406 KeyPress    20030609-120944-714 "SPACE" Status=(up) Key(32) Extra(0xc039)
407 KeyPress    20030609-120944-826 "I" Status=(down) Key(73) Extra(0x17)
408 KeyPress    20030609-120944-894 "I" Status=(up) Key(73) Extra(0xc017)
409 KeyPress    20030609-120944-968 "S" Status=(down) Key(83) Extra(0x1f)
410 KeyPress    20030609-120945-036 "S" Status=(up) Key(83) Extra(0xc01f)
411 KeyPress    20030609-120945-086 "SPACE" Status=(down) Key(32) Extra(0x39)
412 KeyPress    20030609-120945-162 "SPACE" Status=(up) Key(32) Extra(0xc039)
413 KeyPress    20030609-120945-349 "A" Status=(down) Key(65) Extra(0x1e)
414 KeyPress    20030609-120945-409 "A" Status=(up) Key(65) Extra(0xc01e)
415 KeyPress    20030609-120945-483 "SPACE" Status=(down) Key(32) Extra(0x39)
416 KeyPress    20030609-120945-561 "SPACE" Status=(up) Key(32) Extra(0xc039)
417 KeyPress    20030609-120945-619 "L" Status=(down) Key(76) Extra(0x26)
418 KeyPress    20030609-120945-727 "I" Status=(down) Key(73) Extra(0x17)
419 KeyPress    20030609-120945-773 "L" Status=(up) Key(76) Extra(0xc026)
420 KeyPress    20030609-120945-799 "I" Status=(up) Key(73) Extra(0xc017)
421 KeyPress    20030609-120945-807 "T" Status=(down) Key(84) Extra(0x14)
422 KeyPress    20030609-120945-865 "T" Status=(up) Key(84) Extra(0xc014)
423 KeyPress    20030609-120945-971 "T" Status=(down) Key(84) Extra(0x14)
424 KeyPress    20030609-120946-033 "L" Status=(down) Key(76) Extra(0x26)
425 KeyPress    20030609-120946-039 "T" Status=(up) Key(84) Extra(0xc014)
426 KeyPress    20030609-120946-113 "L" Status=(up) Key(76) Extra(0xc026)
427 KeyPress    20030609-120946-183 "E" Status=(down) Key(69) Extra(0x12)
428 KeyPress    20030609-120946-241 "E" Status=(up) Key(69) Extra(0xc012)
429 KeyPress    20030609-120946-500 "SPACE" Status=(down) Key(32) Extra(0x39)
430 KeyPress    20030609-120946-592 "SPACE" Status=(up) Key(32) Extra(0xc039)
431 KeyPress    20030609-120946-974 "T" Status=(down) Key(84) Extra(0x14)
432 KeyPress    20030609-120947-042 "E" Status=(down) Key(69) Extra(0x12)
433 KeyPress    20030609-120947-074 "T" Status=(up) Key(84) Extra(0xc014)
434 KeyPress    20030609-120947-112 "E" Status=(up) Key(69) Extra(0xc012)
435 KeyPress    20030609-120947-134 "X" Status=(down) Key(88) Extra(0x2d)
436 KeyPress    20030609-120947-202 "X" Status=(up) Key(88) Extra(0xc02d)
437 KeyPress    20030609-120947-254 "T" Status=(down) Key(84) Extra(0x14)
438 KeyPress    20030609-120947-334 "T" Status=(up) Key(84) Extra(0xc014)
439 KeyPress    20030609-120947-581 "SPACE" Status=(down) Key(32) Extra(0x39)
440 KeyPress    20030609-120947-693 "SPACE" Status=(up) Key(32) Extra(0xc039)
441 KeyPress    20030609-120947-966 "E" Status=(down) Key(69) Extra(0x12)
442 KeyPress    20030609-120948-046 "E" Status=(up) Key(69) Extra(0xc012)
443 KeyPress    20030609-120948-100 "N" Status=(down) Key(78) Extra(0x31)
444 KeyPress    20030609-120948-182 "N" Status=(up) Key(78) Extra(0xc031)
445 KeyPress    20030609-120948-212 "T" Status=(down) Key(84) Extra(0x14)
446 KeyPress    20030609-120948-302 "T" Status=(up) Key(84) Extra(0xc014)
447 KeyPress    20030609-120948-380 "E" Status=(down) Key(69) Extra(0x12)
448 KeyPress    20030609-120948-456 "E" Status=(up) Key(69) Extra(0xc012)
449 KeyPress    20030609-120948-512 "R" Status=(down) Key(82) Extra(0x13)
450 KeyPress    20030609-120948-612 "R" Status=(up) Key(82) Extra(0xc013)
451 KeyPress    20030609-120948-621 "E" Status=(down) Key(69) Extra(0x12)
452 KeyPress    20030609-120948-701 "E" Status=(up) Key(69) Extra(0xc012)
453 KeyPress    20030609-120948-821 "D" Status=(down) Key(68) Extra(0x20)
454 KeyPress    20030609-120948-905 "D" Status=(up) Key(68) Extra(0xc020)
455 KeyPress    20030609-120948-953 "SPACE" Status=(down) Key(32) Extra(0x39)
456 KeyPress    20030609-120949-009 "SPACE" Status=(up) Key(32) Extra(0xc039)
457 KeyPress    20030609-120949-071 "T" Status=(down) Key(84) Extra(0x14)
458 KeyPress    20030609-120949-137 "T" Status=(up) Key(84) Extra(0xc014)
459 KeyPress    20030609-120949-193 "O" Status=(down) Key(79) Extra(0x18)
460 KeyPress    20030609-120949-299 "SPACE" Status=(down) Key(32) Extra(0x39)
461 KeyPress    20030609-120949-315 "O" Status=(up) Key(79) Extra(0xc018)
462 KeyPress    20030609-120949-383 "SPACE" Status=(up) Key(32) Extra(0xc039)
463 KeyPress    20030609-120949-706 "D" Status=(down) Key(68) Extra(0x20)
464 KeyPress    20030609-120949-806 "D" Status=(up) Key(68) Extra(0xc020)
465 KeyPress    20030609-120950-300 "E" Status=(down) Key(69) Extra(0x12)
466 KeyPress    20030609-120950-358 "E" Status=(up) Key(69) Extra(0xc012)
467 KeyPress    20030609-120950-482 "M" Status=(down) Key(77) Extra(0x32)
468 KeyPress    20030609-120950-560 "M" Status=(up) Key(77) Extra(0xc032)
469 KeyPress    20030609-120950-648 "O" Status=(down) Key(79) Extra(0x18)
470 KeyPress    20030609-120950-740 "O" Status=(up) Key(79) Extra(0xc018)
471 KeyPress    20030609-120950-794 "N" Status=(down) Key(78) Extra(0x31)
472 KeyPress    20030609-120950-878 "N" Status=(up) Key(78) Extra(0xc031)
473 KeyPress    20030609-120950-916 "S" Status=(down) Key(83) Extra(0x1f)
474 KeyPress    20030609-120951-010 "S" Status=(up) Key(83) Extra(0xc01f)
475 KeyPress    20030609-120951-090 "T" Status=(down) Key(84) Extra(0x14)
476 KeyPress    20030609-120951-210 "R" Status=(down) Key(82) Extra(0x13)
477 KeyPress    20030609-120951-222 "T" Status=(up) Key(84) Extra(0xc014)
478 KeyPress    20030609-120951-288 "R" Status=(up) Key(82) Extra(0xc013)
479 KeyPress    20030609-120951-408 "A" Status=(down) Key(65) Extra(0x1e)
480 KeyPress    20030609-120951-530 "A" Status=(up) Key(65) Extra(0xc01e)
481 KeyPress    20030609-120951-550 "T" Status=(down) Key(84) Extra(0x14)
482 KeyPress    20030609-120951-640 "T" Status=(up) Key(84) Extra(0xc014)
483 KeyPress    20030609-120951-702 "E" Status=(down) Key(69) Extra(0x12)
484 KeyPress    20030609-120951-778 "E" Status=(up) Key(69) Extra(0xc012)
485 KeyPress    20030609-120951-840 "SPACE" Status=(down) Key(32) Extra(0x39)
486 KeyPress    20030609-120951-922 "SPACE" Status=(up) Key(32) Extra(0xc039)
487 KeyPress    20030609-120951-950 "T" Status=(down) Key(84) Extra(0x14)
488 KeyPress    20030609-120952-012 "H" Status=(down) Key(72) Extra(0x23)
489 KeyPress    20030609-120952-032 "T" Status=(up) Key(84) Extra(0xc014)
490 KeyPress    20030609-120952-088 "H" Status=(up) Key(72) Extra(0xc023)
491 KeyPress    20030609-120952-126 "E" Status=(down) Key(69) Extra(0x12)
492 KeyPress    20030609-120952-194 "E" Status=(up) Key(69) Extra(0xc012)
493 KeyPress    20030609-120952-344 "SPACE" Status=(down) Key(32) Extra(0x39)
494 KeyPress    20030609-120952-428 "SPACE" Status=(up) Key(32) Extra(0xc039)
495 KeyPress    20030609-120952-572 "SHIFT" Status=(down) Key(16) Extra(0x2a)
496 KeyPress    20030609-120952-694 "K" Status=(down) Key(75) Extra(0x25)
497 KeyPress    20030609-120952-768 "SHIFT" Status=(up) Key(16) Extra(0xc02a)
498 KeyPress    20030609-120952-771 "K" Status=(up) Key(75) Extra(0xc025)
499 KeyPress    20030609-120953-259 "E" Status=(down) Key(69) Extra(0x12)
500 KeyPress    20030609-120953-339 "E" Status=(up) Key(69) Extra(0xc012)
501 KeyPress    20030609-120953-379 "Y" Status=(down) Key(89) Extra(0x15)
502 KeyPress    20030609-120953-463 "Y" Status=(up) Key(89) Extra(0xc015)
503 KeyPress    20030609-120953-521 "SHIFT" Status=(down) Key(16) Extra(0x2a)
504 KeyPress    20030609-120953-665 "C" Status=(down) Key(67) Extra(0x2e)
505 KeyPress    20030609-120953-715 "SHIFT" Status=(up) Key(16) Extra(0xc02a)
506 KeyPress    20030609-120953-735 "C" Status=(up) Key(67) Extra(0xc02e)
507 KeyPress    20030609-120953-901 "A" Status=(down) Key(65) Extra(0x1e)
508 KeyPress    20030609-120953-993 "A" Status=(up) Key(65) Extra(0xc01e)
509 KeyPress    20030609-120954-105 "P" Status=(down) Key(80) Extra(0x19)
510 KeyPress    20030609-120954-181 "P" Status=(up) Key(80) Extra(0xc019)
511 KeyPress    20030609-120954-305 "T" Status=(down) Key(84) Extra(0x14)
512 KeyPress    20030609-120954-375 "T" Status=(up) Key(84) Extra(0xc014)
513 KeyPress    20030609-120954-455 "U" Status=(down) Key(85) Extra(0x16)
514 KeyPress    20030609-120954-509 "U" Status=(up) Key(85) Extra(0xc016)
515 KeyPress    20030609-120954-531 "R" Status=(down) Key(82) Extra(0x13)
516 KeyPress    20030609-120954-639 "R" Status=(up) Key(82) Extra(0xc013)
517 KeyPress    20030609-120954-659 "E" Status=(down) Key(69) Extra(0x12)
518 KeyPress    20030609-120954-717 "E" Status=(up) Key(69) Extra(0xc012)
519 KeyPress    20030609-120954-879 "SPACE" Status=(down) Key(32) Extra(0x39)
520 KeyPress    20030609-120954-997 "SPACE" Status=(up) Key(32) Extra(0xc039)
521 KeyPress    20030609-120955-157 "P" Status=(down) Key(80) Extra(0x19)
522 KeyPress    20030609-120955-241 "P" Status=(up) Key(80) Extra(0xc019)
523 KeyPress    20030609-120955-273 "R" Status=(down) Key(82) Extra(0x13)
524 KeyPress    20030609-120955-355 "R" Status=(up) Key(82) Extra(0xc013)
525 KeyPress    20030609-120955-381 "O" Status=(down) Key(79) Extra(0x18)
526 KeyPress    20030609-120955-455 "O" Status=(up) Key(79) Extra(0xc018)
527 KeyPress    20030609-120955-497 "G" Status=(down) Key(71) Extra(0x22)
528 KeyPress    20030609-120955-561 "R" Status=(down) Key(82) Extra(0x13)
529 KeyPress    20030609-120955-593 "G" Status=(up) Key(71) Extra(0xc022)
530 KeyPress    20030609-120955-655 "R" Status=(up) Key(82) Extra(0xc013)
531 KeyPress    20030609-120955-771 "A" Status=(down) Key(65) Extra(0x1e)
532 KeyPress    20030609-120955-867 "A" Status=(up) Key(65) Extra(0xc01e)
533 KeyPress    20030609-120955-921 "M" Status=(down) Key(77) Extra(0x32)
534 KeyPress    20030609-120955-995 "M" Status=(up) Key(77) Extra(0xc032)
535 KeyPress    20030609-120956-562 "SHIFT" Status=(down) Key(16) Extra(0x2a)
536 KeyPress    20030609-120956-759 "1" Status=(down) Key(49) Extra(0x2)
537 KeyPress    20030609-120956-841 "SHIFT" Status=(up) Key(16) Extra(0xc02a)
538 KeyPress    20030609-120956-848 "1" Status=(up) Key(49) Extra(0xc002)
539 KeyPress    20030609-120956-986 "RETURN" Status=(down) Key(13) Extra(0x1c)
540 KeyPress    20030609-120957-066 "RETURN" Status=(up) Key(13) Extra(0xc01c)
541 KeyPress    20030609-120957-158 "RETURN" Status=(down) Key(13) Extra(0x1c)
542 KeyPress    20030609-120957-254 "RETURN" Status=(up) Key(13) Extra(0xc01c)
543 Mouse       20030609-120958-388 "MOUSEMOVE" ID(0x200) x(694) y(749)
544 Mouse       20030609-120958-397 "MOUSEMOVE" ID(0x200) x(694) y(748)
751 Mouse       20030609-121002-078 "MOUSEMOVE" ID(0x200) x(173) y(207)
752 Mouse       20030609-121002-094 "MOUSEMOVE" ID(0x200) x(173) y(206)
753 Mouse       20030609-121002-659 "LBUTTONDOWN" ID(0x201) x(173) y(206)
754 Mouse       20030609-121002-659 "MOUSEMOVE" ID(0x200) x(173) y(206)
755 Mouse       20030609-121002-758 "LBUTTONUP" ID(0x202) x(173) y(206)
756 Mouse       20030609-121002-758 "MOUSEMOVE" ID(0x200) x(173) y(206)
757 Mouse       20030609-121002-833 "LBUTTONDBCLK" ID(0x203) x(173) y(206)
758 Mouse       20030609-121002-839 "MOUSEMOVE" ID(0x200) x(173) y(206)
759 TimeMessage 20030609-121007-134 Counter(827642371141) Frequency(3579545Hz) Correction(165ms)
760 AutoSave

# End of file


None known. (What, problems with my code? You must be kidding...)


  1. What operating systems does the KeyCapture software run on?

    KeyCapture has been tested on Windows 98, and Windows XP. It should work on Windows 95, ME, NT, and 2000 as well. If you can try any of these other operating systems and get back to me, that would be great!

    (I've received reports that KeyCapture does work on Windows 2000.)

  2. My subjects are concerned about their privacy.

    Typically, KeyCapture records every keystroke, and hence passwords, confidential letters, and other private text. From experience, we know that it is very difficult to find people willing to be subjects (i.e. to have KeyCapture installed on their computer) because of privacy concerns. These privacy concerns inspired us to release the KeyCapture_Suspend program (new in version 1.2).

    The KeyCapture_Suspend.exe program temporarily suspends KeyCapture. Subjects should be instructed to start the suspend program before entering any confidential data, and to close the suspend program when they are done.

  3. What format is the data file in? How do I convert it to ASCII?

    You will notice that while KeyCapture is running it stores its data in a file called either AutoSave.KC or c:\windows\temp\KeyCaptureEmergencySaveFile. One of these files is used (depending upon whether KeyCapture can write to its installed directory or not) to store the data in a binary format. Please ignore these files - they do store your data, but I've provided an easy way to get your data in ASCII.

    To retreive your data, run the KeyCapture_Config program and click on "Save Data". A dialogue box will appear allowing you to set the filename and directory to save your data. The file produced is in ACSII, and can be viewed with window's NotePad, or any other text editor.

  4. I think I've found a bug - KeyCapture does not collect any data when the KeyCapture_Config program is running!

    You are correct, but it's a feature, not a bug. KeyCapture suspends data capture while the config program is running, because researchers are interested in the keystrokes and mouse actions performed by the normal users of a computer. It's important that this data not be contaminated with data of the researcher configuring the KeyCapture program.

  5. What does the "Clear Data" button do?

    The "Clear Data" button causes KeyCapture to delete all of the data it has collected so far. If you've been running KeyCapture and for some reason want to throw-away the data collected, then click on "Clear Data". Note that there is no way to get your data back afterwards.

  6. Somebody moved the KeyCapture directory on me, and now KeyCapture says there is no data to save.

    KeyCapture keeps track of where it is installed (the directory) using a key in the registry. Knowing where it is installed makes it easy for KeyCapture to find its parts (the .exe, the .dll, etc.). If you move KeyCapture to another directory, you must run the KeyCapture_Config program, and click on "Uninstall". Then run the config program again, and enable KeyCapture.

    When KeyCapture can't write to the AutoSave.KC file, it instead writes to a file called c:\windows\temp\KeyCaptureEmergencySaveFile. To get your data from this emergency save file, do the following:

    1. Copy the current AutoSave.KC file (if there is one) to AutoSave.Backup.
    2. Run KeyCapture_Config.exe, and click on "Uninstall".
    3. Move the emergency file (c:\windows\temp\KeyCaptureEmergencySaveFile) to the directory that the KeyCapture programs are currently in. Rename the file: AutoSave.KC.
    4. Run the config program and save your data.
    5. If there was already a AutoSave.KC file in step 1 above, then rename it back (rename AutoSave.Backup to AutoSave.KC). Run the config program and save your data.

  7. I've got the data file, now what do I do?

    I used a series of AWK programs to process the data files and collect the statistics I was interested in. (AWK is a text-file processing tool commonly available on most Unix operating systems - including Linux.) I don't have any windows-based analysis software, but I'll e-mail you a couple of AWK programs, if you're interested.

  8. I want a feature added...

    I am interested in feature suggestions, however, as I've moved on to other projects I'm not likely to implement any features that aren't interesting to me. However, if you want to (a) pay me or (b) collaborate on a publication with me, then I may become more interested in your suggested features.

  9. How do I compile the source code?

    To compile the source code you need microsoft's visual c++ product. The source code consists of four parts (one for each of the .exe, the .dll, the config program, and the suspend program). You must compile the .dll first. (This is because the other programs all depend upon a file called dll.lib created when the .dll is compiled.) You can compile the other programs in any order. The executables and .dll are all placed into the directory called Executables.

If you've got questions, please feel free to e-mail me at: .


Corpora and other sources of text data

Project Gutenberg
Project Gutenberg (Sailor's Project)
British National Corpus
A list of several corpora
The Brown Corpus
Linguistic digram frequency tables
Phrase sets for evaluating text entry techniques the phrase set is here.

Interesting text input methods

The Fitaly Keyboard
Letter Wise, and Word Wise

Some noteworthy text input researchers

William Soukoreff (Me!)
Dr. Scott MacKenzie
Dr. Shumin Zhai