Start page: ARABART home
← DinarSoft

TapText

More Text, Less Taps.

Saved text, typed into any app in two taps: signatures, replies, addresses, form answers and date stamps. Best Misc. Utility of 2007.

Latest
1.3, February 2006
First
1.0, March 2005
Price then
$9.99
Today
Free
Runs on
Pocket PC 2002, Windows Mobile 2003 and 5. Portrait, landscape and square screens
TapText
TapText’s start screen: a pen signing a line, “TapText”, and “Tap more with only a tap”.
TapText’s menu: Signatures, Email templates, Reports, Meeting Notes, Quotes, Finding Help and Financial, each with its icon.
TapText’s options: a tree of menus and items, from Signatures and Business Card to Email templates and Project Status, with buttons to add, edit and reorder.
TapText’s start screen: a pen signing a line, “TapText”, and “Tap more with only a tap”.

The story

Typing on a Pocket PC meant a stylus and a tiny keyboard on the screen. TapText put a small icon at the top of the screen that opened your own menus of saved text. Pick an item, and TapText typed it into whatever app you were in, Word, Notes, email or a web form, without leaving it and without changing your keyboard. Today, text replacement and saved replies in your mail app do the same.

It wrote date and time stamps in the format you chose, nested menus inside menus, gave each item an icon from its own library, and filled forms field by field. Smartphone & Pocket PC magazine named it the best Misc. Utility of 2007.

Every version

From DinarSoft’s revision history and installers. Press Run to play through them, or step one at a time.

TapText.history
  1. TapText 1.0 March 7, 2005

    • The first release.
  2. TapText 1.1 March 28, 2005

    • Notes up to 8,000 characters each.
    • Keeps the first letter in the case you chose.
    • Works fully with TextMaker.
    • More date formats.
    • Copy, cut, paste and undo inside the options.
  3. TapText 1.2 April 14, 2005

    • More date formats.
    • Special keys: Ctrl+B, Ctrl+I, Ctrl+U and Tab.
  4. TapText 1.3 February 27, 2006

    • Import and export your menus, to back up or switch profiles.
    • Room for longer text.
    • Smarter {tap} for filling forms.
    • Square screens.

Saved text, two taps away

On a Pocket PC you typed with a stylus, one letter at a time, on a keyboard the size of a stamp. TapText put a pen on the top bar. Tap it, tap a saved text, and TapText types it into whatever program is in front.

Signatures, email replies, addresses, report outlines, meeting notes, links: its sample menus show what people typed again and again. Menus nest inside menus, each entry has an icon, and dates and times fill themselves in. Try it in Pocket Word, then switch to Notes and pick the same text. TapText takes a different road into each, and the next two sections show both.

Pocket Word8:03
NewEditViewTools
TapText rebuilt from its own files. Tap the pen on the top bar, then pick any saved text.
The program in front

Pick a saved text from TapText’s menu.

Groups open beside each other as cascading menus, or one at a time, with a Previous Menu entry to go back. The setting is global, and each group can overrule it: the Quotes group always opens as one menu. Today your phone does the same job with text replacements and saved replies, built into the system. In 2005 no system offered it, so Yasser and Hosam built it for every program at once.

Borrowing another program’s focus

To type into Pocket Word, TapText must know which box inside it has the cursor. Windows answers that question only for Pocket Word itself. So for the length of one message, TapText becomes part of Pocket Word.

Every window has a window procedure, the one function that receives all its messages. TapText swaps in a helper of its own and sends one message that only that helper understands. The helper, now running inside Pocket Word, asks Windows for the focus. Then the original procedure goes straight back. Step through it:

TapText.exe kept: Pocket Word’s procedure types into: the page
Pocket Word window procedure: Pocket Word’s own zoom list the page

TapText found the page in Pocket Word and types into it.

TAPTEXT.EXE borrowing the focus
  1. 1E1ECbl RegisterWindowMessageW; its own message
  2. 1E214cmp r1,lr; helper: my message?
  3. 1E21Cbl GetFocus; yes: ask from inside
  4. 1E240bl CallWindowProcW; no: pass it on
  5. 1E254bl GetForegroundWindow; the program in front
  6. 1E25Cbl IsWindow; still there?
  7. 1E274bl GetWindowLongW; its window procedure
  8. 1E284str r0,[r5]; keep the old one
  9. 1E28Cbl SetWindowLongW; swap in the helper
  10. 1E2A8bl SendMessageW; send its message
  11. 1E2BCbl SetWindowLongW; swap the old one back
  12. 1E2CCpop {r4,r5,r6,pc}; return the focus
The same in C
  1. msg = RegisterWindowMessage(
  2. L"SpecialGetFocusMessage");
  3. LRESULT Helper(HWND w, UINT m,
  4. WPARAM a, LPARAM b) {
  5. if (m == msg)
  6. return (LRESULT)GetFocus();
  7. return CallWindowProc(old, w, m, a, b);
  8. }
  9. HWND BorrowFocus(void) {
  10. HWND w = GetForegroundWindow();
  11. if (!IsWindow(w)) return 0;
  12. old = GetWindowLong(w, GWL_WNDPROC);
  13. SetWindowLong(w, GWL_WNDPROC, Helper);
  14. HWND f = SendMessage(w, msg, 0, 0);
  15. SetWindowLong(w, GWL_WNDPROC, old);
  16. return f;
  17. }
Watches
Help

TapText now knows exactly where to type, in any program, without changing a byte of it.

It works in any program, including ones written years after TapText, because it asks nothing of them. Today, a keyboard app on iPhone or Android gets the same answer from the system: an input connection to the text box in focus. TapText had no such door, so it made one that closed behind it.

One key press at a time

Once TapText knows the box, it types the way your finger would: one WM_CHAR message per character, the same message a real key press makes.

A new line gets the character and the Enter key too, so programs that listen for either one see it. Notes is the one exception. TapText recognizes its editor by name, puts the whole text on the clipboard, and presses Notes’ own Paste command: one message instead of hundreds. This is the sample General email reply going into Pocket Word:

Hi, ... Best Regards

Messages posted: 35

  1. WM_CHAR “s”
  2. WM_CHAR Enter
  3. WM_KEYDOWN Enter
  4. WM_KEYUP
  5. WM_CHAR space
  6. WM_CHAR backspace
TAPTEXT.EXE typing
  1. 13820bl wcslen; how long?
  2. 13834bl GetClassNameW; what kind of box?
  3. 13840bl lstrcmpW; "noteeditclass"?
  4. 1388Cbl SetClipboardData; Notes: the clipboard
  5. 138ACbl PostMessageW; Notes: its Paste
  6. 138D4bl PostMessageW; WM_CHAR space
  7. 138ECbl PostMessageW; WM_CHAR backspace
  8. 138F4bl Sleep; 100 ms
  9. 13900ldrh r2,[r5]; next character
  10. 13904cmp r2,#0xa; line feed: skip
  11. 1391Cbl PostMessageW; WM_CHAR: the character
  12. 13924cmp r3,#0xd; a new line?
  13. 13940bl PostMessageW; WM_KEYDOWN Enter
  14. 1395Cbl PostMessageW; WM_KEYUP
  15. 13974bl PostMessageW; WM_CHAR space
  16. 13994bl PostMessageW; WM_CHAR backspace
  17. 139A4bhi 13900; to the end
The same in C
  1. void Type(HWND w, WCHAR *s, int n) {
  2. if (n == -1) n = wcslen(s);
  3. GetClassName(w, cls, 250);
  4. if (!lstrcmp(cls, L"noteeditclass")) {
  5. SetClipboardData(CF_UNICODETEXT, h);
  6. PostMessage(w, WM_COMMAND, 0x1647, 0);
  7. Sleep(100); return;
  8. }
  9. PostMessage(w, WM_CHAR, ' ', 1);
  10. PostMessage(w, WM_CHAR, '\b', 1);
  11. Sleep(100);
  12. for (; n > 0; n--, s++) {
  13. if (*s == '\n') continue;
  14. PostMessage(w, WM_CHAR, *s, 1);
  15. if (*s == '\r') {
  16. PostMessage(w, WM_KEYDOWN, VK_RETURN, 1);
  17. PostMessage(w, WM_KEYUP, ...);
  18. PostMessage(w, WM_CHAR, ' ', 1);
  19. Sleep(100);
  20. PostMessage(w, WM_CHAR, '\b', 1);
  21. }
  22. }
  23. }
Watches
Help

To the end: 24 characters became 35 messages, each one a key press as far as Pocket Word knows.

Dates that write themselves

Saved text can hold macros. {{DATE:…}} and {{TIME:…}} stand for the moment of typing, and {{TAB}} jumps to the next box of a form. {{CTRL-B}} and friends switch on bold, italic and underline.

The item editor offers ten date formats and five time formats, each shown on a sample date, 16 March 2005 at 3:27:57 in the afternoon. Each kind of macro is a small C++ class with its own Read and Run, so the typing loop never needs to know which kind it holds. After every macro, TapText borrows the focus again: after a {{TAB}}, the next text lands in the next box. Pick a format and step through the sample “Date and time” item:

The saved text
Ottawa in {{DATE:MMMM d, yyyy}}
The time is now {{TIME:h:mm tt}}
On the page
Ottawa in March 16, 2005
The time is now 3:27 PM
Select Date Format
Select Time Format
TAPTEXT.EXE macros
  1. 13A10bl wcsstr; "{{DATE:"?
  2. 13A20bl operator new; a Date macro
  3. 13A70bl wcsstr; "{{TIME:"?
  4. 13AB4bl wcsstr; "{{TAB"?
  5. 13B08bl wcsstr; "{{CTRL-"?
  6. 1E2F8bl sub_1E250; borrow the focus
  7. 1E310bl sub_139F4; find a macro
  8. 1E330bl sub_1E2DC; type the text before
  9. 1E33Cbl sub_13B78; read up to }}
  10. 1E358mov pc,r3; run it: vtable[1]
  11. 1E35Cbl sub_1E250; borrow the focus again
  12. 1E378bl sub_1E2DC; type the rest
The same in C
  1. BOOL TypeItem(Item *it) {
  2. HWND f = BorrowFocus();
  3. for (WCHAR *p = it->text; *p; ) {
  4. Macro *m;
  5. WCHAR *at = FindMacro(p, &m);
  6. if (!at) { Type(f, p, -1); break; }
  7. Type(f, p, at - p);
  8. p = m->Read(at);// up to }}
  9. m->Run(f);
  10. f = BorrowFocus();
  11. }
  12. return TRUE;
  13. }
  14. WCHAR *FindMacro(WCHAR *p, Macro **m) {
  15. if ((at = wcsstr(p, L"{{DATE:")))
  16. *m = new DateMacro;
  17. else if ((at = wcsstr(p, L"{{TIME:")))
  18. *m = new TimeMacro;
  19. else if ((at = wcsstr(p, L"{{TAB")))
  20. *m = new TabMacro;
  21. else if ((at = wcsstr(p, L"{{CTRL-")))
  22. *m = new CtrlMacro;
  23. return at;
  24. }
Watches
Help

Nothing left to find. Type the last new line, and the item is done.

The dates come from Windows’ own GetDateFormat and GetTimeFormat, so month and day names follow the language of the phone. Today a text expander does the same with a template variable like {date}.

Your menus in one small file

Every menu, every saved text and every icon choice lives in one file, TapText.dmd. Version 1.3 added Import and Export, to back it up or keep one set for work and one for home.

The file is plain text, two bytes a character: a G starts a group, an I an item, an S a separator. Every title and every text follows an X and its length in five digits. So a saved text can hold any character, new lines and all, and TapText never has to search for where it ends. Pick an entry in the editor’s tree, switch one off or fold a group, and watch the file change:

Menu Items
TapText.dmd 7176 bytes
DinarSoftTapTextX00001110X00000X00000X00009G110X00001X00010SignaturesX00003G110X00040X00008PersonalX00003I1X00043X00013Email addressX00029mailto:James.Watt@example.comI1X00044X00007AddressX00055James Watt20 - 100 Atlanta Rd.Barhaven, NJ00000 I1X00041X00004NameX00024Yours sincerelyJames SG110X00048X00008BusinessX00004I1X00043X00013Email addressX00029mailto:James.Watt@example.comI1X00036X00013Business CardX00094James WattMarketing ManagerDinarSoft Corp.Tel : +1 123 456 7890Fax : +1 123 456 7891 I1X00042X00015Email signatureX00067James WattMarketing ManagerDinarSoft Corp.www.DinarSoft.com I1X00044X00007AddressX00071James WattDinarSoft Corp100 Pine Rd. Unit 5Manhattan, NY12345 G100X00003X00015Email templatesX00003I1X00030X00014Standard replyX00110Dear Sir,We have received you Email.One of our staff members will get back to you very soon DinarSoft I1X00048X00009Thank youX00041Dear Sir,Thank you for your Email....I1X00020X00007GeneralX00024Hi,...Best Regards G110X00005X00007ReportsX00004I1X00034X00009FinancialX00066{{DATE:MMMM}}Sales : 00.00 $Expenses : 00.00$Net. : 00.00$ I1X00028X00014Project StatusX00179{{DATE:dddd, MMMM d, yyyy}}X - Market studyX - Initial designX - Design reviewX - Implementation   - Beta testing   - Bug fixes   - Packaging   - Product Release I1X00024X00010AttendanceX00116X - James Watt   - John Malak   - Ron BakerX - Susan LeeX - Bob Lance   - Chantal FollerX - Mike Taber I1X00023X00013Date and timeX00067Ottawa in {{DATE:MMMM d, yyyy}}The time is now {{TIME:h:mm tt}} G100X00006X00013Meeting NotesX00003I1X00046X00005StartX00095{{DATE:dddd, MMMM d, yyyy}} Title : ...Attendence : ... Start time : {{TIME:h:mm tt}} I1X00052X00007ActionsX00108Action Items :A1 Name : ...Action : ...A2Name : ...Action : ...A3Name  : ...Action : ... I1X00046X00003EndX00066Action items :A1 :A2 : Meeting ended @ {{TIME:h:mm tt}} SG110X00039X00009Web linksX00006I1X00050X00017DinarSoft SupportX00053http://www.aximsite.com/boards/forumdisplay.php?=60 I1X00053X00006GoogleX00023http://www.google.com I1X00048X00003CNNX00020http://www.cnn.com I1X00040X00003MSNX00020http://www.msn.com I1X00026X00015How stuff worksX00030http://www.howstuffworks.com I1X00034X00013Yahoo financeX00026http://finance.yahoo.com G101X00031X00006QuotesX00007I1X00055X00006FutureX00065"The best way to predict the future is to invent it."Alan Kay I1X00056X00013Lion and CalfX00098"The lion and the calf shall lie down together but the calf won't get much sleep"Woddy Allen  I1X00057X00007CourageX00069"Many would be cowards if they had courage enough"Thomas Fuller  I1X00058X00008PatienceX00080"Patience has its limits. Take it too far, and it's cowardice"George Jackson I1X00059X00011Rare personX00082"It's a rare person who wants to hear what he doesn't want to hear"Dick Cavett I1X00055X00010Ending warX00065"The quickest way of ending a war is to lose it"Grorge Orwell I1X00056X00010ExcellenceX00074"The sad truth is that excellence makes people nervous"Shana Alexander I1X00026X00012Finding HelpX00035I'm trying to find some help on ...I1X00027X00009FinancialX00030This is the financial report 

“Business Card” is one record: I for item, its flag and icon number, then its title and text, each after X and its length.

The file on this page is written by a few lines of code and comes out identical to the TapText.dmd in its installer, all 7,182 bytes. The icons are not in the file at all, only their numbers. All 60 sit side by side in one picture inside TapText.exe, 960 pixels wide and 16 tall. Each menu row shows its own 16-pixel slice, the same trick as a sprite sheet on a web page.

Four files in the box

The TapText 1.3 installer is a CAB file that unpacks four files on the Pocket PC, plus the instructions that say where each one goes.

TapText 1.3 installer, unpacked · 174,395 bytes

TapText.exe 153,088 bytes, 88%

The whole program: the pen on the top bar, the menus, the typing, the macros, the option pages and the key check. 67,584 bytes of ARM code and 69,632 bytes of pictures and dialogs, among them the 60-icon strip.

Then and now
2005 to 20062026Why it is the same idea
PostMessage(WM_CHAR) into the program in front commitText on Android, insertText in an iOS keyboard Text arrives in the box as if it were typed.
A helper swapped into the front window for one message The system’s input connection to the focused field Find the box with the cursor.
GetDateFormat with dddd, MMMM d, yyyy Intl.DateTimeFormat, DateFormatter Dates in the phone’s own language.
A Startup shortcut to TapTextLauncher.exe A login item, or a boot receiver on Android Be ready the moment the device is.
TapText.dmd with Import and Export Text replacements synced to the cloud Your snippets outlive the device.

The key and the 15 days

TapText cost $9.99 and ran free for 15 days. A key unlocked it, and its check is generous: it tries three families of keys made for each Pocket PC, then five keys that work on every Pocket PC.

The per-device keys come from the Pocket PC Code, each family with its own secret word. The five universal keys are built in. Four are made from people’s names, Yasser’s own among them. The fifth is made from GIVEAWAYVERSION1, and it is the key this site gives you. The word goes through the same 120-number shuffle as HijriDate’s key, with the word TapText. Step through it:

Built-in word: GIVEAWAYVERSION1

The 120 numbers after the shuffle keyed by “TapText”, and the 16 letters of the key: XZTZCRYCIGKNUKFX. 27 95 63 86 116 64 62 54 46 60 58 101 118 59 69 10 52 70 24 35 51 16 92 89 25 36 50 4 14 41 44 39 112 85 115 98 56 87 1 19 47 21 105 9 80 108 6 107 67 32 55 5 81 94 76 74 93 75 26 23 20 2 88 99 117 71 29 8 7 96 17 45 40 0 106 38 82 12 61 110 13 102 37 57 104 22 68 73 42 30 34 84 114 33 78 15 97 103 3 49 100 66 48 72 90 91 113 28 119 11 83 79 18 65 31 109 111 77 43 53 KEY X Z T Z C R Y C I G K N U K F X

Key: XZTZ - CRYC - IGKN - UKFX

TAPTEXT.EXE the key
  1. 180A8bl wcslen; length of the code
  2. 180F0strh r3,[r1]; S[i] = i
  3. 1812Cstrh r3,[r1]; K: the word, repeated
  4. 1815Cadd r1,r3,r1; j += S[i] + K[i]
  5. 1816Cmov pc,r3; __rt_udiv: mod 120
  6. 18184strh r7,[r0]; swap S[i], S[j]
  7. 181A4next:add r1,r7,#1; i += 1
  8. 181D4add r1,r8,r5; j += S[i]
  9. 181F8strh r5,[r0]; swap them
  10. 18204add r1,r3,r2,lsr #16; t = S[i] + S[j]
  11. 1822Ceor r1,r2,r3; char XOR S[t]
  12. 1823Cmov pc,r3; __rt_udiv: mod 25
  13. 18248add r0,r3,#0x41; + 'A'
  14. 18258cmp r3,#0x4f; skip 'O'
  15. 18270bhi next; next character
The same in C
  1. void Key(WCHAR *code, WCHAR *word) {
  2. WORD S[120], K[120]; n = wcslen(code);
  3. for (i = 0; i < 120; i++) S[i] = i;
  4. for (i = 0; i < 120; i++)
  5. K[i] = word[i % wcslen(word)];
  6. for (i = j = 0; i < 120; i++) {
  7. j = (j + S[i] + K[i]) % 120;
  8. swap(&S[i], &S[j]);
  9. }
  10. for (i = j = 0; n--; code++) {
  11. i = (i + 1) % 120;
  12. j = (j + S[i]) % 120;
  13. swap(&S[i], &S[j]);
  14. t = (S[i] + S[j]) % 120;
  15. c = 'A' + (*code ^ S[t]) % 25;
  16. *code = c >= 'O' ? c + 1 : c;
  17. }
  18. }
Watches
Help

All 16: XZTZ - CRYC - IGKN - UKFX. Type it on any Pocket PC, and TapText is registered.

TapText’s own check routine, running in an ARM emulator, accepted XZTZ - CRYC - IGKN - UKFX on 100 different Pocket PCs. It accepted the per-device key for each of another 100, and it turned away all 600 look-alike keys it was given.

The 15 days use DinarSoft’s 14-byte date record, the same one HijriDate keeps in a file. TapText hides it in the registry, in HKEY_CLASSES_ROOT, the crowded corner where programs register their file types, under a key named VB.register. Even the value’s name, Platform, never appears whole in the program: it is put together from Pl, at and form. Run the days forward, set the clock back, or reinstall:

Registry: HKEY_CLASSES_ROOT \ VB.register
NameTypeData
PlatformREG_BINARY09 01 DD 08 EB 08 07 01 07 01 06 01 03 00

The trial version will expire after 12 day(s).

In 2026, Yasser Awad released TapText as freeware. The unlock section above gives you the key.

Awards and reviews

Best Software Awards
Pocket PC Magazine’s Best Software Awards, later Smartphone & Pocket PC’s, by app and year
App200320042005200620072008
TapTextNo entryNo entryNomineeNomineeWinnerFinalist
  • Pocket PC Thoughts

    TapText is quickly becoming a utility that I can’t live without

    TapText · Brad Adrian, August 2, 2006

    Read the review
Inbox (7) · Microsoft Office Outlook 2003

Arranged By: DateNewest on top

  1. Eten BlogDec 12, 2007TapText Data With Ease
  2. The GadgeteerAug 23, 2007DinarSoft TapText - Windows Mobile Utility
  3. Smartphone & Pocket PC200Expert picks
  4. PC TodayNov 2006New & Updated Mobile Software
  5. Pocket PC ThoughtsAug 2, 2006Speed Up Text Entry With TapText
  6. Pocket PC ThoughtsApr 29, 2005DinarSoft TapText 1.0: Repetitive Text Entry is Less Repetitive
  7. AximSiteMar 7, 2005Tap Text

Download

Here are all 2 installers the Internet Archive kept, as DinarSoft published them. Take the one marked latest: the .CAB installs straight on the device, the .exe installs from a Windows PC.

FileVersionSizeSHA-256
DinarSoftTapText13.CABInstall on the Pocket PC · latestRecovered from the Internet Archive (Wayback Machine, January 17, 2007)1.3178.6 KB38dcaf0b243094b5c00ee54bea8e3e69802719b4485f70076b33e7aa6d7c7d1a
DinarSoftTapText13.exeRun on a Windows PC with ActiveSync · latestRecovered from the Internet Archive (Wayback Machine, December 29, 2006)1.3280 KBfb8bdfede6795ac253eca3e976b3767c24756ba684c9ed31b4afd53de3702c31
Check a download

Pick an installer you downloaded. Your browser computes its SHA-256 fingerprint on your own device, nothing is uploaded, and looks for it among all 24 DinarSoft files. A match means every byte is the one the Internet Archive kept.

Unlock the full version

TapText: Register

Every DinarSoft trial asked for an unlock key after 15 days. In 2026 Yasser Awad made TapText free, so here is the key, made the way DinarSoft made it.

Your unlock key XZTZ - CRYC - IGKN - UKFX

One key for every device: the giveaway key built into TapText itself. Tap TapText’s icon at the top of the screen, tap Opt, open About, tap Register… and type the four groups of four letters.

For TapText 1.3.

Install it

  1. On a Pocket PC or Windows Mobile phone. Download the .CAB file marked latest. Copy it to the device on a memory card, through ActiveSync, or download it in Pocket Internet Explorer. Then open File Explorer on the device and tap it. It installs itself, like tapping an .apk on Android.
  2. From a Windows PC. Connect the device through ActiveSync on Windows XP, or Windows Mobile Device Center on later Windows, and run the Setup .exe. It sends the app to the device.
  3. In an emulator. Microsoft’s Device Emulator runs Windows Mobile 5 and 6 on a Windows PC. In its File menu, choose Configure and set a shared folder. The device sees that folder as its Storage Card. Put the .CAB there and tap it in File Explorer.
  4. Unlock it. Open TapText, find its Register screen, and type the key from this page.