<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6542386313627723887</id><updated>2011-11-27T18:48:20.090-06:00</updated><category term='gett'/><category term='indignation'/><category term='Vista'/><category term='delimiter'/><category term='Lesson 3'/><category term='Sneak Peeks'/><category term='findreplace'/><category term='mailto'/><category term='QM Help'/><category term='Blog Intro'/><category term='InsertLineN'/><category term='Report Delivery'/><category term='wait'/><category term='Toolbar'/><category term='The Extra Mile'/><category term='addline'/><category term='Strings'/><category term='find'/><category term='new-line character'/><category term='getwintext'/><category term='[]'/><category term='Diet Coke'/><category term='Variables'/><category term='Beta'/><category term='SetValue'/><category term='zero-based'/><category term='flags'/><category term='Gold Version'/><category term='getsel'/><category term='Lesson 6'/><category term='numlines'/><category term='Accessible Objects'/><category term='len'/><category term='getfile'/><category term='Lesson 1'/><category term='Paste Escaped'/><category term='apostrophe'/><category term='key'/><category term='me'/><category term='Window Assignment'/><category term='Text Sensitive Menu'/><category term='Lesson 5'/><category term='from'/><category term='Value'/><category term='The Pou-up Menu'/><category term='Virtual-key codes'/><category term='WinAmp Automation'/><category term='win'/><category term='clo'/><category term='QM Quickling'/><category term='rep'/><category term='File Enumeration'/><category term='RemoveLineN'/><category term='WM_Command Messages'/><category term='commas and tabs'/><category term='GUI Hacks'/><category term='SendMessage'/><category term='setclip'/><category term='Format'/><category term='Lesson 2'/><category term='Alerts'/><category term='cURL'/><category term='OnScreenDisplay'/><category term='Lesson 4'/><category term='out'/><category term='Escape Characters'/><category term='https'/><category term='Alpha'/><category term='Automation Theory'/><category term='Speak'/><category term='Code Grinder'/><category term='Macro Stacking'/><category term='Opacity'/><title type='text'>The Macro Hook</title><subtitle type='html'>This is my discoveries of new and interesting ways to use &lt;br&gt;Quick Macros to make my life less of a FREAKIN' HASSLE.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>32</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-7854745171570337243</id><published>2008-01-01T21:44:00.000-06:00</published><updated>2008-01-01T21:54:24.677-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code Grinder'/><title type='text'>How many licks does it take....</title><content type='html'>So let's see....new job, new field....that'll be 4 months of your blogging life, please.&lt;br /&gt;&lt;br /&gt;So, at the end of August, I started a new job as a database programmer.  A pretty significant step up from my previous position as a report writer not just in database but in automation as well.  The shop I moved to is using the Opalis Robot as their automation/scheduling core.  A nice product with some kickin' features; however, we are a full version behind and really need to move to get caught up and take advantage of their new version.&lt;br /&gt;&lt;br /&gt;Anyway, I'm back and just posted a new category of articles.  There are so many dialogs in QM that help you build code and make it much easier, I thought I'd start going over them.  I call them 'Code Grinders'.  And like a saugsage grinder, you put a bunch of unrealated food products into the top, flip the switch, and it mashes them all together into a nice neat stretched intestinal package.  Anyway, the first in on File Enumeration.  Ever need to get the list of files in a directory one at a time?  Now you can with the Code Grinder:File Enumeration.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-7854745171570337243?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/7854745171570337243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=7854745171570337243' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/7854745171570337243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/7854745171570337243'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2008/01/how-many-licks-does-it-take.html' title='How many licks does it take....'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-4758707962946422131</id><published>2008-01-01T21:40:00.000-06:00</published><updated>2008-01-01T21:43:56.571-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Variables'/><category scheme='http://www.blogger.com/atom/ns#' term='Code Grinder'/><category scheme='http://www.blogger.com/atom/ns#' term='File Enumeration'/><title type='text'>Code Grinder 1: File Enumeration</title><content type='html'>Code Grinders:  File Enumeration&lt;br /&gt;&lt;br /&gt;So, a buddy of mine was talking to me the other day, and he was needing to get all the names of the files in a certain directory.  I told him, easy, just use the 'Code Grinder' &lt;i&gt;File Enumeration&lt;/i&gt; that's in the main QM Toolbar under 'Files, Web'.  A 'Code Grinder' is a term I came up with to describe dialogs that help you come up with pre-formatted code with just a little bit of info from you.  In the same way that you drop some meat, garlic, pepper, salt, sage into the hopper, turn it on and shove it all down the grinder's throat.  It's the same here in QM.  The grinder is usually a dialog of some kind and the meat and spices are locations or variable names.&lt;br /&gt;&lt;img style="margin: 1em 0pt 0pt 1em; width: 419px; height: 375px; float: right;" src="http://docs.google.com/File?id=ah3469cffg3j_48fncxxcgh" /&gt;&lt;br /&gt;Let's take a look at the &lt;i&gt;File Enumeration&lt;/i&gt; grinder and see what we can come up with (or is that, ...'see with what we can come up'....no, that's not right either... ummmm....'see what can come up from ourselves'...yeah, that's totally not the right direction....man, I hate that whole, "you can't end a sentence with a preposition" thing...is it any better going on and on like this at the end of a sentence rather than a preposition?).  Anyway, so start up that dialog and lets take a look.  Click the File Enumeration icon in the 'Files, Web' menu and here's what we've got.&lt;br /&gt;&lt;br /&gt;As you can see, it's a pretty straight forward dialog but there are some real useful features.  First, you can browse to the folder you are looking for or you can choose 'Special Folders' that will be the same on all computers.  It looks like this.  &lt;img style="margin: 1em 0pt 0pt 1em; float: right;" src="http://docs.google.com/File?id=ah3469cffg3j_49d57vtz73" height="421" width="393" /&gt;&lt;br /&gt;&lt;div id="zjpe" style="padding: 1em 0pt; text-align: left;"&gt;&lt;br /&gt;I've circled some of the things that are a real pain when moving from computer to computer, but with 'Special Folders' you can make it quite easy to get to those directories no matter who is logged in (doh, preposition again!).  You can set date/time qualifiers as well as 'this folder/subfolders' options as well.  Now where this grinder really gets cooking is in the 'Variables' section.  If you need just filenames, just put in your variable name in the field.  If you need the path, just put in your variable name in that field.  If you need the size etc, etc, etc.&lt;br /&gt;&lt;br /&gt;Here's the code I get from asking it to list the filenames on the desktop.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;Dir &lt;/span&gt;d&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;foreach&lt;/span&gt;(d "$Desktop$\*" &lt;span style="color: rgb(0, 128, 240);"&gt;FE_Dir&lt;/span&gt;)&lt;br /&gt;&lt;/code&gt; &lt;div style="margin-left: 40px;"&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;str &lt;/span&gt;sPath=d.FileName()&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;out &lt;/span&gt;sPath&lt;/code&gt;&lt;/div&gt;   &lt;p&gt;&lt;br /&gt;&lt;/p&gt; Go ahead and dump that into your QM and see what happens.  It's that easy.  Now 'sPath' has the filename of each file as it loops through the directory.  So, now you have a way to get some or all that info automatically (or at least so close to automatically that it makes little difference).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-4758707962946422131?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/4758707962946422131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=4758707962946422131' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/4758707962946422131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/4758707962946422131'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2008/01/code-grinder-1-file-enumeration.html' title='Code Grinder 1: File Enumeration'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-1584187987060008782</id><published>2007-08-20T12:42:00.000-05:00</published><updated>2007-08-20T12:46:02.354-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QM Quickling'/><category scheme='http://www.blogger.com/atom/ns#' term='OnScreenDisplay'/><category scheme='http://www.blogger.com/atom/ns#' term='clo'/><title type='text'>QM Quickling: OnScreenDisplay</title><content type='html'>&lt;code  style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 128, 240);"&gt;&lt;span class="misspell" suggestions=""&gt;OnScreenDisplay&lt;/span&gt;&lt;/span&gt;("Opening FireFox" -1 0 0 "&lt;span class="misspell" suggestions="Aerial,Aral,Ariel,Areal,Ariela"&gt;Arial&lt;/span&gt; Black" 30 0&lt;span class="misspell" suggestions="ff,eff,off"&gt;xff&lt;/span&gt; 4 "FF_Start" 0x343434 )&lt;/code&gt;&lt;br /&gt;&lt;p style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="font-family: verdana;"&gt;   So, this one has been floating around in the forums for a while and I thought I'd give my slants on it. &lt;/p&gt; &lt;p style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="font-family: verdana;"&gt; When I'm starting a program or a process that might take more than 1 second, I like to give a visual confirmation that it actually did start.  For instance:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="font-family: verdana;"&gt; &lt;/p&gt; &lt;div id="img_9713957299669295" style="padding: 1em 0pt; text-align: left; font-family: verdana;"&gt;   &lt;img src="https://docs.google.com/File?id=ah3469cffg3j_42fnvfvjf5" style="width: 370px; height: 61px;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, here's how the parameters break out:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;       your text.  you can also use a string variable instead. &lt;code&gt;&lt;span style="color: rgb(0, 128, 240);"&gt;&lt;span class="misspell" suggestions=""&gt;OnScreenDisplay&lt;/span&gt;&lt;/span&gt;(&lt;span class="misspell" suggestions="strategist,strictest,strangest,strongest,strategy's"&gt;strText&lt;/span&gt;)&lt;/code&gt;     &lt;/li&gt;&lt;li&gt;       the time the display stay on screen.  the default is 0 (5 seconds) or -1 for indefinite.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the X Y coordinates of where to put the top left corner of the box.  0 0 is the middle of the screen.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the font name (mine is "&lt;span class="misspell" suggestions="Aerial,Aral,Ariel,Areal,Ariela"&gt;Arial&lt;/span&gt; Black").  I get mine from the font drop-down list in Word.&lt;/li&gt;&lt;li&gt;font size (mine is 30).&lt;/li&gt;&lt;li&gt;font colour in hex.  I use &lt;a title="http://www.nattyware.com/pixie.html" target="_blank" href="http://www.nattyware.com/pixie.html" id="vnip"&gt;Pixie&lt;/a&gt; but you can &lt;span style="font-style: italic;"&gt;try http://www.free-webmaster-tools.com/colorpicker.htm&lt;/span&gt; to do it online but I don't know how safe the site is.&lt;/li&gt;&lt;li&gt;flags.  Note: you can add the numbers together to have it activate more than one state (i.e. 6 is number 2 and number 4).&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;   1 - nontransparent. The background in transparent or not (not supported on Win98/Me).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;   2 - synchronous. The macro pauses till the text disappears (see #2 above).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;   4 - the user can click to hide the window.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;you can create an easy handle for the display window.  For example, &lt;code&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span class="misspell" suggestions="Clo,COL,Col,col,Cleo"&gt;clo&lt;/span&gt; win&lt;/span&gt;("&lt;/code&gt;&lt;code&gt;FF_Start&lt;/code&gt;&lt;code&gt;")&lt;/code&gt;&lt;/li&gt;&lt;li&gt;background colour in hex&lt;/li&gt;&lt;li&gt;&lt;span class="misspell" suggestions="wrap width,wrap-width"&gt;wrapwidth&lt;/span&gt;.  this will create a multi-line display box with this number as the width (I didn't use it here); very handy for string variable texts.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Here is another format I use for a differ process.&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 240);"&gt;OnScreenDisplay&lt;/span&gt;("Removing Dups...please wait" 0 0 0 "" 18 292929 4 "Rmv_Dps")&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Ok, so now you have 5 days to put this into your code or I will mail you macros back to you in a box....one function at a time.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-1584187987060008782?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/1584187987060008782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=1584187987060008782' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/1584187987060008782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/1584187987060008782'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/08/qm-quickling-onscreendisplay.html' title='QM Quickling: OnScreenDisplay'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-3403132401140168872</id><published>2007-08-12T20:08:00.000-05:00</published><updated>2007-08-12T20:11:21.813-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QM Quickling'/><category scheme='http://www.blogger.com/atom/ns#' term='len'/><category scheme='http://www.blogger.com/atom/ns#' term='find'/><category scheme='http://www.blogger.com/atom/ns#' term='new-line character'/><title type='text'>QM Quickling: FIND</title><content type='html'>&lt;code  style="font-family:verdana;"&gt;_i= &lt;span style="color: rgb(0, 0, 255);"&gt;find&lt;/span&gt;(a "5")&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt; This topic has hit the forums a lot lately and so I decided to do a little something on it.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt; 'Find' is one of those funny little functions that returns a number instead of assigning it's value to a string like 'findreplace', 'left', etc.  What it's doing is giving you the position of the first character of the sub-string that it finds.  Here's an example right out of the Help document (press F1 and surf in there for a while it's really well done).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code  style="font-family:verdana;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;str &lt;/span&gt;s = "Notepad.exe"&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;int &lt;/span&gt;i = &lt;span style="color: rgb(0, 0, 255);"&gt;find&lt;/span&gt;(s ".exe")&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;out &lt;/span&gt;i&lt;span style="color: rgb(0, 160, 0);"&gt;;; now i is 7&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;p style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="font-family: verdana;"&gt;   Things to remember: &lt;/p&gt; &lt;ul style="font-family: verdana;"&gt;&lt;li&gt;     it is zero indexed so you need to remember that the first character is in position 0 not 1.   &lt;/li&gt;&lt;li&gt;     because it is zero indexed, the position returned for the last character will be 1 less than the length of the string.   &lt;/li&gt;&lt;li&gt; if there is more than one line, the "newline" character in the Windows world is actually 2 characters.  Here's an example of that: &lt;/li&gt;&lt;ul&gt;&lt;li&gt;       &lt;code&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;int &lt;/span&gt;z&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;str &lt;/span&gt;a=&lt;br /&gt;&lt;span style="color: rgb(0, 160, 0);"&gt;;1&lt;br /&gt;;2&lt;br /&gt;;3&lt;br /&gt;;4&lt;br /&gt;;5&lt;/span&gt;&lt;br /&gt;z=&lt;span style="color: rgb(0, 0, 255);"&gt;len&lt;/span&gt;(a)&lt;br /&gt;_i= &lt;span style="color: rgb(0, 0, 255);"&gt;find&lt;/span&gt;(a "3")&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;out &lt;/span&gt;z&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;out &lt;/span&gt;_i&lt;/code&gt;     &lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt; Find is useful even if you don't care where in the source-string the string lies.  For example, if you just want to know that it is in there somewhere, just test to see if the number returned is greater than '-1' which is what is returned if it is not present.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Ok, so now you have 5 days to put this into your code and learn the Feng shui of 'find'.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-3403132401140168872?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/3403132401140168872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=3403132401140168872' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/3403132401140168872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/3403132401140168872'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/08/qm-quickling-find.html' title='QM Quickling: FIND'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-3377093920091277818</id><published>2007-08-06T11:41:00.000-05:00</published><updated>2007-08-06T11:45:19.377-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QM Quickling'/><category scheme='http://www.blogger.com/atom/ns#' term='Blog Intro'/><title type='text'>QM Quickling: Intro</title><content type='html'>&lt;p style="font-family: verdana;" class="MsoNormal"&gt;The summer break!  What a deal, everyday sit there and say, "holy cow it's been a long time since my last lesson; what am I gonna do?!"  Well, since I've been busy doing some job hunt stuff and I still haven't made that million dollars I was hoping to get when I started blogging, I've decided to declare "Bloggging Bankruptcy" and start afresh...or call it "The Summer Break".  Well, that's not entirely true.  What I have been doing is thinking about making more posts about functions all in themselves in addition to full-blown lessons.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt; So, be looking for the "QM Quickling" (QMQ) which will be short synopsis of various functions and how to put them to use.  This week's QMQ will be on incorporating 'find' in your code.  &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-3377093920091277818?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/3377093920091277818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=3377093920091277818' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/3377093920091277818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/3377093920091277818'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/08/qm-quickling-intro.html' title='QM Quickling: Intro'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-6315655997515072720</id><published>2007-07-10T11:11:00.000-05:00</published><updated>2007-07-10T10:00:03.407-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Speak'/><category scheme='http://www.blogger.com/atom/ns#' term='Lesson 6'/><category scheme='http://www.blogger.com/atom/ns#' term='The Extra Mile'/><category scheme='http://www.blogger.com/atom/ns#' term='OnScreenDisplay'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI Hacks'/><category scheme='http://www.blogger.com/atom/ns#' term='WM_Command Messages'/><category scheme='http://www.blogger.com/atom/ns#' term='WinAmp Automation'/><category scheme='http://www.blogger.com/atom/ns#' term='SendMessage'/><title type='text'>Lesson 6: The Extra Mile</title><content type='html'>&lt;span style="font-family:verdana;"&gt;  Well, there are other options to dealing with dialogs....don't.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt; I use &lt;/span&gt;&lt;a style="font-family: verdana;" title="winamp.com" target="_blank" href="http://winamp.com/"&gt;Winamp&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; as my media player, not just because I can make it do strange and very useful little things but because I hate llamas.  I have macros that will let me move forward and back in the media being played by 5 seconds, 30 seconds, and 3 minutes.  I can also grab the current position of the playing media and save it to a text file sort of like "bookmarking".  Now, of course you can  do this via the buttons on the player and dialogs but it's clunky and not very responsive, so here's what I do.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;I went nosing around the SDK for Winamp and got a hold of their 'WM_COMMAND Messages' definitions and menu ids.  Now, instead of using a mouse command 'click here' on 'this window', I can forgo the whole graphical interface and it's associated problems.  Here's how I'm moving 5 seconds forward or back using QM.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code  style="font-family:verdana;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;men &lt;/span&gt;40144 &lt;span style="color: rgb(0, 0, 255);"&gt;win&lt;/span&gt;("" "Winamp v1.x") &lt;span style="color: rgb(0, 160, 0);"&gt;;;Back 5 seconds&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;code  style="font-family:verdana;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;men &lt;/span&gt;40060 &lt;span style="color: rgb(0, 0, 255);"&gt;win&lt;/span&gt;("" "Winamp v1.x") &lt;span style="color: rgb(0, 160, 0);"&gt;;;FFwd 5 seconds&lt;/span&gt;&lt;/code&gt;  &lt;p&gt;&lt;/p&gt;&lt;p  style="font-family:verdana;"&gt;This responds MUCH faster via a trigger key than even using a mouse click manually but it's "faking" a menu choice.  And, if I know I want to move 30 seconds forward (for skipping commercials on &lt;a title="dl.tv" target="_blank" href="http://dl.tv/"&gt;dl.tv&lt;/a&gt;-sorry, guys...but I do watch the interesting ones...and GoDaddy ain't one of 'em), I use this code:&lt;/p&gt;&lt;p face="verdana"&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;int &lt;/span&gt;hwnd=&lt;span style="color: rgb(0, 0, 255);"&gt;win&lt;/span&gt;("" "Winamp v1.x")&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;(!hwnd) &lt;span style="color: rgb(0, 0, 255);"&gt;ret&lt;/span&gt;&lt;br /&gt;_i=&lt;span style="color: rgb(160, 0, 0);"&gt;SendMessage&lt;/span&gt;(hwnd &lt;span style="color: rgb(128, 128, 128);"&gt;WM_USER &lt;/span&gt;0 105)&lt;br /&gt;_i+30000&lt;span style="color: rgb(0, 160, 0);"&gt;;;time to skip in miliseconds (this is 30 seconds)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(160, 0, 0);"&gt;SendMessage&lt;/span&gt;(hwnd &lt;span style="color: rgb(128, 128, 128);"&gt;WM_USER &lt;/span&gt;_i 106)&lt;/code&gt;  &lt;/p&gt;&lt;p style="font-family: verdana;"&gt;If you look closely, you'll see that I'm using the 'SendMessage' capability to get the current position in milliseconds (105) and then sending a new value back to the player (106).  I get remarkably fast response times when doing this; the video at worst barely even stutters.  This is much better than even using my above macro repeated 6 times.&lt;br /&gt;&lt;/p&gt;&lt;p style="font-family: verdana;"&gt;Once you start getting a feel for what the 'SendMessage' commands start returning, you can really start cooking up some useful things.  For instance, when I get a hold of a really good tune, I have a tendency to listen to it for 5 or 6 hours just repeating over and over.  So, I came up with a quick method to force Winamp to do this. Since there is no setting for "Repeat Song" you have to build it from 2 settings:  "Repeat Playlist"  and "Manual Advance". &lt;/p&gt;&lt;p style="font-family: verdana;"&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;int &lt;/span&gt;y z&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;int &lt;/span&gt;hwnd=&lt;span style="color: rgb(0, 0, 255);"&gt;win&lt;/span&gt;("" "Winamp v1.x")&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;(!hwnd) &lt;span style="color: rgb(0, 0, 255);"&gt;ret&lt;/span&gt;&lt;br /&gt;z=&lt;span style="color: rgb(160, 0, 0);"&gt;SendMessage&lt;/span&gt;(hwnd &lt;span style="color: rgb(128, 128, 128);"&gt;WM_USER &lt;/span&gt;0 251)&lt;span style="color: rgb(0, 160, 0);"&gt;;;get repeat playlist value&lt;/span&gt;&lt;br /&gt;y=&lt;span style="color: rgb(160, 0, 0);"&gt;SendMessage&lt;/span&gt;(hwnd &lt;span style="color: rgb(128, 128, 128);"&gt;WM_USER &lt;/span&gt;1 634)&lt;span style="color: rgb(0, 160, 0);"&gt;;;get manual advance value&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if &lt;/span&gt;y+z=2&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(0, 128, 240);"&gt;,Speak&lt;/span&gt;("Continue" 0 "" 0 100)&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;        &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(160, 0, 0);"&gt;,SendMessage&lt;/span&gt;(hwnd &lt;span style="color: rgb(128, 128, 128);"&gt;WM_USER &lt;/span&gt;0 635)&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;        &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 128, 240);"&gt;,OnScreenDisplay&lt;/span&gt;("Continue" 1 1000 10 "Arial" 0 0x1d60cd 0 "psa")&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;        &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 128, 240);"&gt;,Speak&lt;/span&gt;("Song Looped" 0 "" 0 100)&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;    &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;        &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 128, 240);"&gt;,OnScreenDisplay&lt;/span&gt;("Song Looped" 1 1000 10 "Arial" 0 0x1d60cd 0 "psa")&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;    &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;        &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(160, 0, 0);"&gt;,SendMessage&lt;/span&gt;(hwnd &lt;span style="color: rgb(128, 128, 128);"&gt;WM_USER &lt;/span&gt;1 635)&lt;span style="color: rgb(0, 160, 0);"&gt;;;set man advance&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;    &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;        &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(160, 0, 0);"&gt;,SendMessage&lt;/span&gt;(hwnd &lt;span style="color: rgb(128, 128, 128);"&gt;WM_USER &lt;/span&gt;1 253)&lt;span style="color: rgb(0, 160, 0);"&gt;;;set repeat&lt;/span&gt;&lt;/code&gt;  &lt;/p&gt;&lt;p style="font-family: verdana;"&gt;Since I want this macro to 'toggle' this state of 'Song Looped' rather than merely just 'turn it on', I have it use an 'if' statement to determine what state it is in and then reverse that state.  I also tell it to give me a little audio feedback so that I know that the macro executed and let me know what it did (that's the 'Speak' function).&lt;/p&gt; &lt;p style="font-family: verdana;"&gt;Now you have two ways of dealing with the GUI (or rather 1 way of dealing with it and 1 way of avoiding it).  So have at it and I'll see you next time cause the hook always brings you back.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-6315655997515072720?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/6315655997515072720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=6315655997515072720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/6315655997515072720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/6315655997515072720'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/07/lesson-6-extra-mile.html' title='Lesson 6: The Extra Mile'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-597178325707125092</id><published>2007-06-25T07:34:00.000-05:00</published><updated>2007-06-25T07:39:34.254-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Alerts'/><category scheme='http://www.blogger.com/atom/ns#' term='Gold Version'/><title type='text'>BYE BYE BETA!!!</title><content type='html'>&lt;span style="font-family: verdana;"&gt;Well 2.2 is now gold!  It's no longer beta and it's ready to roll.&lt;br /&gt;There were a few upgrades to this version but only if you have Vista, otherwise, it seems to be a version history shake down.&lt;br /&gt;&lt;br /&gt;I would like to see some of the new Vista toolbar settings in action though....hint, hint! 90)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-597178325707125092?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/597178325707125092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=597178325707125092' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/597178325707125092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/597178325707125092'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/06/bye-bye-beta.html' title='BYE BYE BETA!!!'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-6411385842088713126</id><published>2007-06-21T11:35:00.000-05:00</published><updated>2007-07-09T11:37:37.862-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lesson 6'/><category scheme='http://www.blogger.com/atom/ns#' term='key'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI Hacks'/><category scheme='http://www.blogger.com/atom/ns#' term='win'/><category scheme='http://www.blogger.com/atom/ns#' term='wait'/><category scheme='http://www.blogger.com/atom/ns#' term='Accessible Objects'/><title type='text'>Lesson 6: Getting Stuck in the GUI Hacks</title><content type='html'>&lt;span style="font-family:Verdana;"&gt;Getting Stuck in the GUI Hacks&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt; GUI hacks are the processes that you have to create because you can't get at the option or method of doing something to/in a program.  For example, a really ugly GUI Hack would be&lt;/span&gt;&lt;br /&gt;&lt;ol style="font-family: Verdana;"&gt;&lt;li&gt;     open Windows Explorer   &lt;/li&gt;&lt;li&gt;     hit Alt-d and put in the directory you want to go to   &lt;/li&gt;&lt;li&gt;     then hitting 'Tab' three times to get to the file list   &lt;/li&gt;&lt;li&gt;     use the 'key' command to start spelling the name of the file you want so     that it is selected   &lt;/li&gt;&lt;li&gt;     type Ctl-c   &lt;/li&gt;&lt;li&gt;     hit Alt-d to move to the address bar and put in the new directory   &lt;/li&gt;&lt;li&gt;     hit 'Tab' three times to get to the file list   &lt;/li&gt;&lt;li&gt;     hit Ctl-v   &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt; Of course no one would do this; that's what 'ren' or 'cop' is for but sometimes you just have to interact with program GUI dialogs.  And God help me, I HATE GUI HACKS!  There are just so many more things that can go wrong so many 'edge-cases' you have to account for...God help me but I hate them.  Well, if you gotta you gotta so here's some ideas that might help.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt; Timing is everything in GUI hacking.  If the dialog is slow to open, or if the field you need inside the dialog is slow to be drawn, or if...blah blah blah.  The first thing I do to make sure my GUI hacks are going to work is put in 'wait's everywhere so that the macro 'paces' itself.  Here's an example of that.  Sometimes when I send emails via Outlook, I don't want a 'message receipt' nor do I want to keep a copy of the sent message, so I have a macro that changes the message property for me and then sends it.  Here's what the dialog looks like.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;img src="https://docs.google.com/File?id=ah3469cffg3j_32d3kmc3dm" style="height: 457px; width: 583px; font-family: Verdana;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt; As you can see, there are two check boxes I want to deselect; they can either be 'clicked' by the mouse (I find this less reliable for various reasons) or the values of the check boxes can be inverted by using keystrokes (Alt-r and Alt-n).  First things first; I have to get the dialog to show up.  I do that by using the "Accessible object actions" item in the "Windows, controls" button on the QM toolbar and drag the aiming reticle on top of the "Options..." button on the message I'm currently writing.  This method works well enough but ask yourself what would happen if the toolbar that had that "Options..." button wasn't visible at the time; the macro would fail immediately (and so would my willowy grasp on sanity).  I'd prefer a keyboard shortcut but I don't have one for it, so I make due.  But now, I have to guess how long to wait for the dialog to show up before I start hitting my keystrokes....or do I?....Nope.  Here's what I do.&lt;/span&gt;&lt;br /&gt;&lt;blockquote  style="font-family:Verdana;"&gt;&lt;code&gt;&lt;span style="color: rgb(160, 0, 0);"&gt;0&lt;/span&gt; WA "Message Options"&lt;/code&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-family:Verdana;"&gt;This is a version of the 'wait' command.  The '0' tells QM to wait indefinitely for the window with the name "Message Options" to become 'active' ('WA'=wait till active).  I pulled the window name directly from the QM Editor itself.  When you have the editor open the status bar continually gives you information on both the cursor position and the window that it is currently hovering over.  The window name is in the first row and comes just after the mouse position relative to the window.  So now, when I start the macro, it 'clicks' the "Options..." button and waits for the dialog to become active; it then sends the keystrokes for the above check boxes and hits 'enter'.  It then waits for the message itself to become active so that it can send the 'Send Message' command via an Alt-s keystroke.&lt;/span&gt;&lt;br /&gt;&lt;blockquote  style="font-family:Verdana;"&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;spe &lt;/span&gt;50&lt;br /&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;Acc &lt;/span&gt;option_a=&lt;span style="color: rgb(0, 0, 255);"&gt;acc&lt;/span&gt;("Options..." "DROPLIST" &lt;span style="color: rgb(0, 0, 255);"&gt;win&lt;/span&gt;(".*Message" "OpusApp" "" 0x200) "MsoCommandBar" "" 0x1001)&lt;br /&gt;option_a.Mouse(1)&lt;br /&gt;&lt;span style="color: rgb(160, 0, 0);"&gt;0&lt;/span&gt; WA "Message Options"&lt;br /&gt;'Ar&lt;br /&gt;'An&lt;br /&gt;'Y&lt;br /&gt;&lt;span style="color: rgb(160, 0, 0);"&gt;0&lt;/span&gt; WA "Message"&lt;br /&gt;'As&lt;/code&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-family:Verdana;"&gt;Now you may ask about the second line from the bottom and say, "Gordon Bennett, not ALL your emails can be tittled 'Message'!"...ok, so maybe &lt;/span&gt;&lt;i style="font-family: Verdana;"&gt;you&lt;/i&gt;&lt;span style="font-family:Verdana;"&gt; wouldn't say that but someone did....probably.....might have....well, ok they &lt;/span&gt;&lt;i style="font-family: Verdana;"&gt;could have&lt;/i&gt;&lt;span style="font-family:Verdana;"&gt; said it give me &lt;/span&gt;&lt;i style="font-family: Verdana;"&gt;that&lt;/i&gt;&lt;span style="font-family:Verdana;"&gt; at least....  Well, this kind of gets into the 'win' function which I should cover another time in depth but let's suffice it to say that, it is case sensitive and can be anywhere within the window name.  Here's what my window's tittle bar actually looks like with a standard message.&lt;/span&gt;&lt;br /&gt;&lt;div style="padding: 1em 0pt; text-align: left; font-family: Verdana;"&gt;   &lt;div style="padding: 1em 0pt; text-align: left;"&gt;     &lt;img src="https://docs.google.com/File?id=ah3469cffg3j_34f269ckv5" /&gt;   &lt;/div&gt; &lt;/div&gt; &lt;span style="font-family:Verdana;"&gt;There it is; a macro with built rest stops (but smells better) for when you just 'have' to GUI hack.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt; So have at it and I'll see you next time cause the hook always brings you back.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-6411385842088713126?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/6411385842088713126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=6411385842088713126' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/6411385842088713126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/6411385842088713126'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/06/getting-stuck-in-gui-hacks.html' title='Lesson 6: Getting Stuck in the GUI Hacks'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-9020335612517277233</id><published>2007-06-18T09:27:00.000-05:00</published><updated>2007-06-18T09:29:36.750-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Alerts'/><category scheme='http://www.blogger.com/atom/ns#' term='Beta'/><title type='text'>Beta Alert:  ROUND 2!</title><content type='html'>&lt;span style="font-family: verdana;" class="postbody"&gt;2.2.0.10 is out now.&lt;br /&gt;Looks like Gintaras forgot to roll in a feature he'd promised on the forums.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul style="font-family: verdana;"&gt;&lt;li&gt;&lt;span class="postbody"&gt; Popup menu expandable folders: removed flag 64 (apply include/exclude to folders), and instead added /filterfolders.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-9020335612517277233?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/9020335612517277233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=9020335612517277233' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/9020335612517277233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/9020335612517277233'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/06/beta-alert-round-2.html' title='Beta Alert:  ROUND 2!'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-3301393789747604791</id><published>2007-06-18T08:05:00.000-05:00</published><updated>2007-06-18T09:29:53.140-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Alerts'/><category scheme='http://www.blogger.com/atom/ns#' term='Beta'/><title type='text'>Beta Alert!</title><content type='html'>&lt;span style="font-family: verdana;"&gt;New beta is now out (download &lt;/span&gt;&lt;a style="font-family: verdana;" href="http://www.quickmacros.com/history.html"&gt;&lt;span&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: verdana;"&gt;).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Not a lot of ground breaking things but some  enhancements for the deep end programmers.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul style="font-family: verdana;"&gt;&lt;li&gt;&lt;span class="postbody"&gt; Better supports ActiveX controls.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="postbody"&gt;Adding files to exe. &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-3301393789747604791?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/3301393789747604791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=3301393789747604791' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/3301393789747604791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/3301393789747604791'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/06/beta-alert.html' title='Beta Alert!'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-6193300035643091278</id><published>2007-06-04T23:08:00.000-05:00</published><updated>2007-06-04T23:11:23.628-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='indignation'/><category scheme='http://www.blogger.com/atom/ns#' term='Automation Theory'/><title type='text'>Paying the Automation Monkey</title><content type='html'>&lt;span style="font-family:Verdana;font-size:85%;"&gt; Well, I had an interesting discussion with a friend of mine the other day; let's call him "Dimitri".  He told me about a reporting project that he was doing where his "superiors" were loath to allow him to automate.  As you can tell from one of my &lt;/span&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;&lt;a title="I'M HAVING AN INDIGNATION MEETING" href="http://themacrohook.blogspot.com/2007/04/im-having-indignation-meeting.html"&gt;posts&lt;/a&gt;, I'm not really hip to that sort of....well, I really can't express how I feel about that without offending a LOT of people and risking a visit from the FBI, Homeland Security, and theEYP (why the EYP ?...well, I can't into that either...but it was a total misunderstanding I swear!)...not to mention a courtesy call from the ELF.  So, let's just say, "I am somewhat opposed to management outright denying permission to automate a re-occurring process."&lt;/span&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;  &lt;/span&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;And what struck me most abhorrent about this situation was not the, capricious Jimmy Carter style micro-management of high-level technical staff, but the apparent lack of understanding of time/worker management or rather the limited understanding of what it costs to actually have people do things....No, I will say it plainly....The COMPLETE lack of understanding math....simple A+B+C+D+E=F kind of math.  These are people that &lt;i&gt;manage &lt;/i&gt;people for a LIVING for crying out loud; this is not a hobby they do; this IS what they do to eat and buy jet-skis.  Stop drinking theKool Aid and take a work-force management course for crying out loud....ehmmm...ok, I'm done....for now....anyway...back to  &lt;/span&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;Dimitri.  Here's the story.&lt;/span&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;&lt;br /&gt; For the next couple of years, &lt;/span&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;Dimitri is &lt;/span&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;going to be running a diagnostic on systems within his organization and receive a small amount of output from that process.  One of his higher-ups, wanted him to put that info into an email and send it out to everyone on a distribution list.  He said that he could do that but none of the info from the diagnostics would be useful or informative for anyone but himself and to send that out would be a waste of time for him and everyone on the list.  About that time, another higher-up got involved and started demanding the info be in a file and not just in an email and not just any file format but a spreadsheet.  At that point, &lt;/span&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;Dimitri&lt;/span&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt; went to his supervisor (yes, this is now the 3rd &lt;i&gt;higher-up&lt;/i&gt; mixed up in this mess) and told him about the problem this &lt;i&gt;TPS &lt;/i&gt;report has now become.  His boss asked him if he could automate the file update process to which my buddy said yes, it is very easy unless you want it in Excel, then it will take at least a 2-3 hours for him to get some info on Perl/Excel functions (or maybe have me code something up in Quick Macros for him).  After hearing how long it would take to automate, one of the two original higher-ups came to my friend's office and said, "It sounds like it's going to take more time to automate this than it will to just do it; so just do it manually for the next two years rather than automating it."  Keep in mind that this person was not &lt;/span&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;even Dimitri's boss.&lt;/span&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;&lt;br /&gt;And, it is at this point that I want to step-in and do a reality check..."Advertising doesn't cost; it pays."...Ok, well I don't have a cool saying for automation like the ad people do for advertising; well, there's "&lt;i&gt;If you do something more than once, you're a sucker&lt;/i&gt;" but that seems overly rude at times.  But, even that doesn't get to the point here.  The point is that if you don't automate it, your going to spend more than that 1-3 hours to automate it.  Here's why.&lt;br /&gt;&lt;br /&gt;Let's say &lt;/span&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;Dimitri &lt;/span&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;spends five minutes actually doing the process every week.  He's going to need to train someone to do it in case he gets hit by a bus (or, God forbid, takes a vacation day).  That person will, at some point, realize that they will need to show someone else how to do it as well, just in case.  So, now we have a 15 minute training session for the first backup and a 25 minute training session for the second backup.  But, if either the first or second backup needs to actually do the process, it's going to take them probably 15 and 25 minutes respectively to do it because it usually 'jumps up at them' and they'll have to scramble to do it which means they'll have to go track down the instructions and then go hunt down their id/password to get into the system to get the data file.  So here's how it actually breaks down:&lt;br /&gt;&lt;br /&gt;Primary and Secondary        15 min X 2   =   30 min&lt;br /&gt;Secondary and Tertiary       25 min X 2   =    50 min&lt;br /&gt;Running the Process ea wk   510 min      =    510&lt;br /&gt;All Goings-back and forth&lt;br /&gt;    talking @ automation      60 min         =    60&lt;br /&gt;&lt;br /&gt;Total                                                      650 min or 10.8 HOURS&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;10 HOURS and 50 MINUTES!&lt;/b&gt;&lt;/u&gt;  HOLY COW!!!  And that doesn't even count the times that the secondary and tertiary run this process.  The very worst case scenario for him to automate this project: 3 hours.  Yeah, "It sounds like it's going to take more time to automate this than it will to just do it; so just do it manually for the next two years rather than automating it"...IN A PIG'S EYE!  Look, I'm the second or third guy to admit that there are times when automating things just doesn't make sense but if you're going to count the cost then &lt;i&gt;count the freakin' cost.&lt;/i&gt;  There are times, like this one, where it is too expensive to &lt;i&gt;not&lt;/i&gt; automate a project and that fact should be painfully obvious even to managers who manage overtime exempt employees.  I'll lay it out for you this way:&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;An employee only has "x" amount of minutes in a day&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;No task takes "0" minutes to complete. &lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;Have your six-year-old add it up for you!&lt;/span&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;&lt;br /&gt;Ok, ok...so, I'm coming off a little over board here; but it is a hard earned sense of indignation that comes from years of seeing "management" (read: "people who get paid more than the 'workers' but don't actually 'know' how to actually 'manage' them") going out of their way to not onlystifle worker productivity in the area of automation but actively seek out the proponents and developers of that automation to discipline with reprimands and down-checks on their yearlyevals. &lt;/span&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;  It's all a big crazy game that they are playing up there and only God knows the rules cause to me it looks like a varsity game of Calvin-Ball.&lt;br /&gt;&lt;br /&gt;Simply put, this is what I'm trying to say, "Automation doesn't cost you time; it pays everyday with interest."....GAHHHH....that was terrible!...see, I still don't have a good catch-phrase for automation....let's just stick with this:&lt;br /&gt;&lt;br /&gt;"If you do something twice, you're a sucker."&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-6193300035643091278?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/6193300035643091278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=6193300035643091278' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/6193300035643091278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/6193300035643091278'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/06/paying-automation-monkey.html' title='Paying the Automation Monkey'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-6078156845398894263</id><published>2007-05-25T13:03:00.000-05:00</published><updated>2007-05-25T13:03:03.448-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Alerts'/><category scheme='http://www.blogger.com/atom/ns#' term='Beta'/><title type='text'>RELEASE ALERT: New Beta is Out</title><content type='html'>&lt;span style="font-family:verdana;"&gt;The new Beta is out; mostly under-the-hood enhancements but there may be a few things of interest.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;computer unlocking that now works on Vista&lt;/li&gt;&lt;li&gt;made the exe's smaller&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-6078156845398894263?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/6078156845398894263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=6078156845398894263' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/6078156845398894263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/6078156845398894263'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/05/release-alert-new-beta-is-out.html' title='RELEASE ALERT: New Beta is Out'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-6047102710305594488</id><published>2007-05-23T10:44:00.000-05:00</published><updated>2007-05-23T10:45:52.824-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Alerts'/><category scheme='http://www.blogger.com/atom/ns#' term='Beta'/><title type='text'>Beta Alert!</title><content type='html'>&lt;span style="font-family: verdana;"&gt;The new beta, 2.2.0.8, is due out this week &lt;span style="font-weight: bold;"&gt;possibly 5/23!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="postbody"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-6047102710305594488?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/6047102710305594488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=6047102710305594488' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/6047102710305594488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/6047102710305594488'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/05/beta-alert.html' title='Beta Alert!'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-2579044825125617850</id><published>2007-05-18T08:11:00.000-05:00</published><updated>2007-05-18T08:17:42.068-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Report Delivery'/><category scheme='http://www.blogger.com/atom/ns#' term='Automation Theory'/><category scheme='http://www.blogger.com/atom/ns#' term='findreplace'/><category scheme='http://www.blogger.com/atom/ns#' term='https'/><category scheme='http://www.blogger.com/atom/ns#' term='cURL'/><category scheme='http://www.blogger.com/atom/ns#' term='gett'/><title type='text'>The Evolution of Automation</title><content type='html'>&lt;span style="font-family: Verdana;"&gt; After 5 lessons (well, 10 really), I thought I'd pause and take a look, not at specific automation code, but how automation evolves out of current processes.  One of my first posts on this site was about the reasons to automate (&lt;/span&gt;&lt;a href="http://themacrohook.blogspot.com/2007/04/im-having-indignation-meeting.html" style="font-family: Verdana;" target="_blank" title="Earlier Blog Post"&gt;I'M HAVING AN INDIGNATION MEETING&lt;/a&gt;&lt;span style="font-family: Verdana;"&gt;).  It gave four reasons &lt;/span&gt;&lt;span style="font-style: italic; font-family: Verdana;"&gt;why&lt;/span&gt;&lt;span style="font-family: Verdana;"&gt; to automate and I've spent the last five weeks showing &lt;/span&gt;&lt;span style="font-style: italic; font-family: Verdana;"&gt;how&lt;/span&gt;&lt;span style="font-family: Verdana;"&gt; to automate.  In this article, I want to discuss how current processes evolve into an automated process in an office environment (can you use anymore Darwin buzz words without talking about 'Natural Selection'?!).  There were a couple of surprisingly useful developments in a recent project that I hadn't actually planned out but just organically evolved when the project came to critical junctures.&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: Verdana;"&gt; The other day a project came across my desk that needed some updating.  For some time, I've been retrieving some text files via a secured web server and adding some html to the contents to deliver to end users via a different secured web connection.  Due to the security setup at my organisation, there had to be a lot of 'tweaking' done to make the automation server (let's call it 'Athens') connect with the data server (let's call it 'Carthage') as well as the machine that was to be the final resting place of the data where the end users will access the report (let's call that one 'Hellespont').  The process was executed by a 7 year old VB exe that frankly was a pain to deal with.  Removing reports were a pain; adding reports were a pain; not fubar-ing the entire process doing either of the above was a pain...Not knowing what you were doing with VB was a pain.  The whole thing was enough to make you ignore it till you could get your hands on an Impala outfitted with a military class JATO rocket, put the entire source-code and exe in the front seat, flip the switch, sit back and watch the glory.  Well, as it turns out, the final security piece fell into place before I could get my hands on that JATO and I knew it was time to grab a large-caliber handgun, a tac-light, and crawl into that Damnbeast den (better make it machine pistol...um...actually two (John Woo style you know)....with extra ammo..all armour piercing of course...(the bullets not the pistols)...although....armour piercing pistols....hmmmmm...anyway).  I then started to map out how I was going to make this thing work.&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: Verdana;"&gt; My first decision was to make it easy to add and subtract reports from the process (see above).  I didn't want to code each report into the function separeatly because that would take a 10 line process and make it 'the-number-of-reports' &lt;/span&gt;&lt;span style="font-style: italic; font-family: Verdana;"&gt;times &lt;/span&gt;&lt;span style="font-family: Verdana;"&gt;10 lines.  In case you weren't sure of what to call that, it's called 'Ugly and Kludgey'.  I decided to create a text file that would contain the address of each report needed on the server Carthage, as well as, the final name of the report when I place it on the server Hellespont for distribution.  These two pieces of info would be separated by a '|' character.  It is just a very simple text document that I can step through one line at a time using '&lt;/span&gt;&lt;code style="font-family: Verdana;"&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt;&lt;/code&gt;&lt;span style="font-family: Verdana;"&gt;' to parse the file and and 'gett' to parse the line.  The file is sort of a 'definitions' file.  This method has several benefits:&lt;/span&gt;&lt;br /&gt; &lt;ol style="font-family: Verdana;"&gt;&lt;li&gt;     to add a report, I just add one line to the end of a text document rather     than opening up QM to add like 10 lines of code to the 180 that are already     there (if there were say 18 reports).  When I say 'I', I'm really     saying 'any of my co-workers' who need to add a report later on because I     got hit by a bus or won the lottery.   &lt;/li&gt;&lt;li&gt;     to remove a report, all I have to do is delete one line rather than opening     up QM and deleting like 10 lines of code.  When I say 'I', I     really....well you get the point....It's called Agile baby!!   &lt;/li&gt;&lt;li&gt;     If reports are added or deleted, there's no need to make 'versions' of the     program (like we do now) because I'm not actually changing the code.   &lt;/li&gt;&lt;/ol&gt; &lt;span style="font-family: Verdana;"&gt; So, now that I have my list of reports and can get info on each of them individually, I need to build the routine for Athens to get them from Carthage.....&lt;voice.julia-child pitch="high"&gt; And here we have all this simple and wonderful code using &lt;/span&gt;&lt;a href="http://curl.haxx.se/" style="font-family: Verdana;" target="_blank" title="http://curl.haxx.se"&gt;cURL&lt;/a&gt;&lt;span style="font-family: Verdana;"&gt; to retrieve the files from Carthage and load them each individually into a string variable &lt;voice.mine&gt;.  I'm not going to go into...&lt;voice.mine&gt; (wow, that didn't work well at all)...I'm not going to go into what I'm doing to get them or how I'm manipulating them (maybe I'll go over that another time); I'll just say that for https retrieval, cURL is really, really, nice! &lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: Verdana;"&gt; So, to sum up, I've retrieved the files from Carthage and modified them so they look better for the end user and then placed them out on Hellespont for the end user.  When I ran it the 'first' time it worked great till I realized one of the reports is no longer used.  No problem, all I have to do is delete that line and....wait....that is never a good idea when dealing with capricious users (or any for that matter).  I'll tell you a little principle I've developed in my years of report design.  The report that has not been looked at for over a year by a single living soul will never even be thought of until you delete it from your report delivery system.  Then an admin assistant is on the phone saying they want it....oh, and they want it for a meeting....today....at 9:30.......um, it's 9:40 now....yep.  And here it is in business speak:&lt;/span&gt;&lt;br /&gt; &lt;div style="margin-left: 40px; font-family: Verdana;"&gt;   The value of a report is not based on its actual use or even its usefulness   but rather directly on its difficulty in recreating its process after it has   been discontinued....for six months....by someone other than yourself.....who   quit because they won the lottery.......you just   &lt;span style="font-style: italic;"&gt;wish&lt;/span&gt; they would get hit by a   bus....while you were driving it.....which is what you'll be doing for a   career if that admin assistant doesn't get that report printed within the next   10 minutes.&lt;br /&gt;&lt;/div&gt; &lt;span style="font-family: Verdana;"&gt; I don't have a catchy name for it yet but now that it's published I have a copy-write on it 80)   ....BTW: I'm taking suggestions for the name.&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: Verdana;"&gt; So, as you can see, I'm a &lt;/span&gt;&lt;span style="font-style: italic; font-family: Verdana;"&gt;&lt;span style="font-size:78%;"&gt;little&lt;/span&gt; &lt;/span&gt;&lt;span style="font-family: Verdana;"&gt;reluctant to just delete the report entry.  [Enter Stage Right: Comment Delimiter] ....Ooooh, excellent!  Comment delimiter!  I can actually use almost any character since all the report addresses have to start with the '/' character.  I chose to use the '#' symbol because I'm used to it when I'm doing Korn shell work in Unix.  My next step was to use '&lt;/span&gt;&lt;code style="font-family: Verdana;"&gt;&lt;span style="color:#0000ff;"&gt;find&lt;/span&gt;&lt;/code&gt;&lt;span style="font-family: Verdana;"&gt;' in a simple '&lt;/span&gt;&lt;code style="font-family: Verdana;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/code&gt;&lt;span style="font-family: Verdana;"&gt;' statement to skip the entire process if the first character is a '#'.  Done.  Now I can keep that report ready in case someone wants it again.....wait a minute....I can also use a 'Comment Delimiter' to do things like '&lt;/span&gt;&lt;span style="font-style: italic; font-family: Verdana;"&gt;make comments&lt;/span&gt;&lt;span style="font-family: Verdana;"&gt;'...just in case I'm found guilty of a &lt;/span&gt;&lt;span style="font-style: italic; font-family: Verdana;"&gt;crime&lt;/span&gt;&lt;span style="font-family: Verdana;"&gt; for hitting that guy with a bus and have to go to prison or something...yeah, I know, long shot; no jury is going to convict me of 'painting a new center-line' with that guy after deleting that report process without documentation.  So without any extra code, I've also added the ability to place as many comments as I want anywhere inside the file as well as deactivating reports.&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: Verdana;"&gt; The 'definitions' file and the commenting capability were things that weren't specifically planned on, they just 'grew' out of the process as it went along.  It solved problems I hadn't realized and became more and more useful as the project progressed.  The comment capability really makes the whole project much more Agile since anyone who comes in behind me can easily find out what I'm doing from the comments in this definitions file.  Which leads me to the next step...documentation.....uhgh.....talk about a Damnbeast.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-2579044825125617850?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/2579044825125617850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=2579044825125617850' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/2579044825125617850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/2579044825125617850'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/05/evolution-of-automation.html' title='The Evolution of Automation'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-1563706498862024452</id><published>2007-05-14T11:53:00.000-05:00</published><updated>2007-05-19T13:35:00.950-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Value'/><category scheme='http://www.blogger.com/atom/ns#' term='Lesson 5'/><category scheme='http://www.blogger.com/atom/ns#' term='The Extra Mile'/><category scheme='http://www.blogger.com/atom/ns#' term='from'/><category scheme='http://www.blogger.com/atom/ns#' term='SetValue'/><category scheme='http://www.blogger.com/atom/ns#' term='Accessible Objects'/><title type='text'>Lesson 5: The Extra Mile</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;span class="misspell" suggestions="OK,OJ,Oak,Oik,KO"&gt;Ok&lt;/span&gt;, so there's more than one way to skin a cat and there's more than just a few ways to get text into a window. This next method is much more complicated but hang with me; if I can do it, I think you will be able to as well.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Go to the "Windows, controls" icon on the QM Toolbar and go down to the "Accessible object actions" menu choice.  This opens up a dialog that looks like this:&lt;br /&gt;&lt;br /&gt;&lt;div style="padding: 1em 0pt; text-align: left; font-family: verdana;"&gt;   &lt;img src="https://docs.google.com/File?id=ah3469cffg3j_19d8fd6fhc" style="width: 506px; height: 346px;" /&gt;&lt;br /&gt;&lt;br /&gt;Take a look at all the different actions on the left-hand side.  These   will really start to open up your possibilities as you get more and more   skilled at QM (or as some say, '&lt;span class="misspell" suggestions="Jung,King,king,lung,Kong"&gt;more kung&lt;/span&gt;-&lt;span class="misspell" suggestions="FY,fur,F,f,FUD"&gt;fu&lt;/span&gt;').  In this lesson, I'm just   going to be dealing with the 'Get value' and the 'Set value'.&lt;br /&gt;&lt;br /&gt;Let's start with a text editor of your choice; I'm going to use Notepad but   you can use anything you like.  First, let's set the value of a   window/field or whatever you are wanting to change.  Click on 'Set value'   and then click-and-hold the 'Drag' icon; drag it over and drop it on the   part of the window for which you want to set the value.    &lt;img src="https://docs.google.com/File?id=ah3469cffg3j_21ckgw78c4" style="margin: 1em 1em 0pt 0pt; float: left;" /&gt; &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt; You'll notice that there is a thick black line surrounding the parts of the window as you hover over them.  Let go of the mouse button when you have selected the right part of the window.  QM now shows you what it 'sees' of that area.&lt;/span&gt;&lt;br /&gt;&lt;div style="padding: 1em 0pt; text-align: left; font-family: verdana;"&gt;   &lt;div style="padding: 1em 0pt; text-align: left;"&gt;     &lt;img src="https://docs.google.com/File?id=ah3469cffg3j_25gzfpqhf2" /&gt;   &lt;/div&gt; &lt;/div&gt;&lt;span style="font-family:verdana;"&gt; Most of the time, you'll need to modify the 'Window' title; you can do that by clicking the button with three dots right next to it.  You'll see this dialog after doing so.&lt;/span&gt;&lt;br /&gt;&lt;img src="https://docs.google.com/File?id=ah3469cffg3j_26dtgc4dhd" style="margin: 1em 1em 0pt 0pt; width: 344px; height: 381px; float: left; font-family: verdana;" /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt; The first thing I usually do is start adding &lt;/span&gt;&lt;span class="misspell" suggestions="wild cards,wild-cards,wildcats,wildcatters,wildcat"  style="font-family:verdana;"&gt;wildcards&lt;/span&gt;&lt;span style="font-family:verdana;"&gt; to the Title.  So, '- Notepad' becomes '*- Notepad'.  Don't forget to also check the 'Use *' &lt;/span&gt;&lt;span class="misspell" suggestions="check box,check-box,checkbooks,checkbook,checkbook's"  style="font-family:verdana;"&gt;checkbox&lt;/span&gt;&lt;span style="font-family:verdana;"&gt; below!  There are other options you can modify but I rarely have to.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;There are also other values you can change in the main dialog too but I'll not be covering that in this lesson.  So, now my dialog looks like this:&lt;/span&gt;&lt;br /&gt;&lt;div style="padding: 1em 0pt; text-align: left; font-family: verdana;"&gt;   &lt;div style="padding: 1em 0pt; text-align: left;"&gt;     &lt;img src="https://docs.google.com/File?id=ah3469cffg3j_27f7d879g2" /&gt;   &lt;/div&gt; &lt;/div&gt;&lt;span style="font-family:verdana;"&gt; You can change the variable assignment if you wish within this dialog before letting QM enter this info into the macro.  Now, hit '&lt;/span&gt;&lt;span class="misspell" suggestions="OK,OJ,Oak,Oik,KO"  style="font-family:verdana;"&gt;Ok&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;' and it puts this info into your macro.&lt;/span&gt;&lt;br /&gt;&lt;blockquote  style="font-family:verdana;"&gt;&lt;code&gt;&lt;span style="color: rgb(128, 0, 128);"&gt;&lt;span class="misspell" suggestions="AC,Ac,Acct,Cc,ARC"&gt;Acc&lt;/span&gt; &lt;/span&gt;a=&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span class="misspell" suggestions="AC,Ac,ac,acct,cc"&gt;acc&lt;/span&gt;&lt;/span&gt;("" "TEXT" &lt;span style="color: rgb(0, 0, 255);"&gt;win&lt;/span&gt;("*- Notepad" "Notepad" "" 0x3) "Edit" "" 0x1800 0x0 0x20000040)&lt;br /&gt;a.&lt;span class="misspell" suggestions="Set Value,Set-Value,Devalue,Stale,Servile"&gt;SetValue&lt;/span&gt;("Hey, set this value.")&lt;/code&gt;   &lt;/blockquote&gt;&lt;span style="font-family:verdana;"&gt;Now that we have a target, let's start putting in the info.  As you can see, the second line of my code is already doing just that.  I can also have it set the value using a variable as well.  Now, the thing to keep in mind about this function is that it will erase anything that is there already....unless......&lt;/span&gt;&lt;br /&gt;&lt;blockquote style="font-family: verdana;"&gt;&lt;code&gt;_s=a.Value()&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 160, 0);"&gt;;;this, of course, gets the value&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;_s.from(_s "[]Now it's both values")&lt;br /&gt;a.&lt;span class="misspell" suggestions="Set Value,Set-Value,Devalue,Stale,Servile"&gt;SetValue&lt;/span&gt;(_s)&lt;/code&gt;  &lt;/blockquote&gt;&lt;span style="font-family:verdana;"&gt;Yep, that's just what we were looking for.  Now, you can 'append' info to the window by feeding its value back into a variable and manipulating than variable.  You may not want to use this technique for more than small dialog fields but who knows, it may be just the thing you're looking for in that hard to get-at window.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;So have at it and I'll see you next time cause the hook always brings you back.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-1563706498862024452?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/1563706498862024452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=1563706498862024452' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/1563706498862024452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/1563706498862024452'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/05/ok-so-theres-more-than-one-way-to-skin_13.html' title='Lesson 5: The Extra Mile'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-6056793627790056117</id><published>2007-05-10T21:59:00.000-05:00</published><updated>2007-05-10T22:07:45.126-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lesson 5'/><category scheme='http://www.blogger.com/atom/ns#' term='QM Help'/><category scheme='http://www.blogger.com/atom/ns#' term='me'/><category scheme='http://www.blogger.com/atom/ns#' term='key'/><category scheme='http://www.blogger.com/atom/ns#' term='apostrophe'/><category scheme='http://www.blogger.com/atom/ns#' term='Virtual-key codes'/><title type='text'>Lesson 5: Swimming The Keystroke</title><content type='html'>&lt;span style="font-family: verdana;"&gt;By this time you've probably started to out pace these lessons or at least come across problems you've had trouble solving when it comes to entering text.  Some windows just don't cooperate...at all.  Well, like ancient archers who picked certain arrows for certain jobs, you can do the same with keystrokes methods.  So far, I've covered '&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153); font-family: verdana;"&gt;outp&lt;/span&gt;&lt;span style="font-family: verdana;"&gt;' with quoted text and with strings but there are two other ways as well:  the '&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153); font-family: verdana;"&gt;key&lt;/span&gt;&lt;span style="font-family: verdana;"&gt;' function and QM key-codes (QM uses special characters to represent the special keys like Alt, Ctl, Shift, etc. (well, not 'etc' that's just one of those Latin things; it's not a keyboard thing)).  Let's start with the apostrophe first. &lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-family: verdana;"&gt; Look at the QM Toolbar that starts up with the Editor; the second icon opens a dialog to show you all the special characters.  You can start using these very easily by invoking the function with an apostrophe like this '  .  &lt;/span&gt;&lt;span style="font-style: italic; font-family: verdana;"&gt;&lt;br /&gt;&lt;br /&gt;Note: I'll be taking many of the examples directly out of the QM Help.  BTW: you can easily access the help documentation and go to the function you are curious about by just placing your cursor on the function and hitting F1; often times there is a very well documented article on the function (sometimes the help text appears in the output window below the editor instead).&lt;br /&gt;&lt;/span&gt;&lt;blockquote style="font-family: verdana;"&gt;&lt;code&gt;'CSf A{ec} Wd      &lt;span style="color:#00a000;"&gt;;;Ctrl+Shift+F, Alt+E+C, Win+D &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color:#00a000;"&gt;note: the Alt key is released after the c key&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;br /&gt;'SnewVSyork        &lt;span style="color:#00a000;"&gt;;;type "New York" using QM key codes&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-family: verdana;"&gt; The apostrophe is a quick and dirty way of getting text to type rather than pasting text via the '&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153); font-family: verdana;"&gt;outp&lt;/span&gt;&lt;span style="font-family: verdana;"&gt;' function.  The '&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153); font-family: verdana;"&gt;key&lt;/span&gt;&lt;span style="font-family: verdana;"&gt;' function works similarly but has more flexibility.  Here is how those examples would look when using '&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153); font-family: verdana;"&gt;key&lt;/span&gt;&lt;span style="font-family: verdana;"&gt;'.&lt;/span&gt;&lt;br /&gt; &lt;blockquote style="font-family: verdana;"&gt;&lt;code&gt;&lt;span style="color:#0000ff;"&gt;key &lt;/span&gt;CSf A{ec} Wd      &lt;span style="color:#00a000;"&gt;;;Ctrl+Shift+F, Alt+E+C, Win+D note: the Alt key is released after the c key&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;key &lt;/span&gt;SnewVSyork        &lt;span style="color:#00a000;"&gt;;;type "New York" using QM key codes&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-family: verdana;"&gt;Yeah I know but that was just to show you how it looks; now let's really get into it.&lt;/span&gt;&lt;br /&gt; &lt;blockquote style="font-family: verdana;"&gt;&lt;code&gt;&lt;span style="color:#0000ff;"&gt;key &lt;/span&gt;(&lt;span style="color:#808080;"&gt;VK_MEDIA_PLAY_PAUSE&lt;/span&gt;)&lt;/code&gt;  &lt;code&gt;&lt;span style="color:#00a000;"&gt;;;Mimics hitting the Play/Pause button&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;key &lt;/span&gt;a (0.5) b         &lt;span style="color:#00a000;"&gt;;;a waits 0.5 second b&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-family: verdana;"&gt;Here's another way of doing multiple keystrokes while holding down modifier keys.  You can put all kinds of things inside that block; not sure what other types of things you would want to though.&lt;/span&gt;&lt;br /&gt; &lt;blockquote style="font-family: verdana;"&gt;&lt;code&gt;&lt;span style="color:#0000ff;"&gt;key&lt;/span&gt;+ CS&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;lef&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;key&lt;/span&gt;- SC&lt;/code&gt; &lt;/blockquote&gt;&lt;span style="font-family: verdana;"&gt;'&lt;/span&gt;&lt;code style="font-family: verdana;"&gt;&lt;span style="color:#0000ff;"&gt;Key&lt;/span&gt;&lt;/code&gt;&lt;span style="font-family: verdana;"&gt;'&lt;/span&gt;&lt;code style="font-family: verdana;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-family: verdana;"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;will also let you feed the contents of a string variable into it.  So, you can easily create the variable value from any other method and then you can have '&lt;span style="color: rgb(51, 51, 255);"&gt;key&lt;/span&gt;' type it in.  This works especially well for a telnet program I use that won't allow direct pasting into the command line.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;code style="font-family: verdana;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;blockquote style="font-family: verdana;"&gt;&lt;code&gt;&lt;span style="color:#0000ff;"&gt;key&lt;/span&gt; _s&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;code style="font-family: verdana;"&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span style="font-family: verdana;"&gt;Now usually, you won't have to go to such drastic measures just to input some text but if you need it (like in my telnet program) you've got it.  Granted, it's not particularly strong  &lt;/span&gt;&lt;span style="font-style: italic; font-family: verdana;"&gt;me (mĀ), &lt;/span&gt;&lt;span style="font-family: verdana;"&gt;but when you gotta have it, you gotta have it.&lt;br /&gt;&lt;br /&gt;So have at it and I'll see you next time cause the hook always brings you back.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-6056793627790056117?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/6056793627790056117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=6056793627790056117' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/6056793627790056117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/6056793627790056117'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/05/lesson-5-swimming-keystroke.html' title='Lesson 5: Swimming The Keystroke'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-3769968320857748501</id><published>2007-05-07T11:24:00.000-05:00</published><updated>2007-05-07T11:43:43.970-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RemoveLineN'/><category scheme='http://www.blogger.com/atom/ns#' term='getfile'/><category scheme='http://www.blogger.com/atom/ns#' term='Lesson 4'/><category scheme='http://www.blogger.com/atom/ns#' term='rep'/><category scheme='http://www.blogger.com/atom/ns#' term='The Extra Mile'/><category scheme='http://www.blogger.com/atom/ns#' term='numlines'/><category scheme='http://www.blogger.com/atom/ns#' term='zero-based'/><category scheme='http://www.blogger.com/atom/ns#' term='new-line character'/><category scheme='http://www.blogger.com/atom/ns#' term='InsertLineN'/><category scheme='http://www.blogger.com/atom/ns#' term='gett'/><category scheme='http://www.blogger.com/atom/ns#' term='Paste Escaped'/><category scheme='http://www.blogger.com/atom/ns#' term='flags'/><category scheme='http://www.blogger.com/atom/ns#' term='out'/><category scheme='http://www.blogger.com/atom/ns#' term='addline'/><category scheme='http://www.blogger.com/atom/ns#' term='commas and tabs'/><category scheme='http://www.blogger.com/atom/ns#' term='[]'/><category scheme='http://www.blogger.com/atom/ns#' term='Strings'/><category scheme='http://www.blogger.com/atom/ns#' term='delimiter'/><title type='text'>Lesson 4: The Extra Mile</title><content type='html'>&lt;span style="font-family:Verdana;"&gt;For me string variables are the sonic screwdriver of coding.  I use them to build not only the functions I need but the logs that monitor them, so being able to manipulate them is crucial for doing the things I want.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt; Let's take a look at the whole log file concept.  I have a text file that is filled with lines of text something like this:&lt;/span&gt;&lt;br /&gt;&lt;blockquote  style="font-family:Verdana;"&gt;Lacedaemonians|60|Menelaus&lt;br /&gt;Boeotians|50|Thersander   &lt;br /&gt;Minyans|30|Ascalaphus&lt;br /&gt;Arcadians|60|Agapenor&lt;/blockquote&gt;&lt;span style="font-family:Verdana;"&gt;The first thing you need to do is get the file data into a string so you can start modifying it.&lt;/span&gt;&lt;br /&gt;&lt;blockquote  style="font-family:Verdana;"&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;str &lt;/span&gt;a b c&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;int &lt;/span&gt;z&lt;/code&gt;&lt;br /&gt;&lt;code&gt;a.getfile("C:\qm\ships.txt")&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-family:Verdana;"&gt;Now lets get just the last line of that text file by using two different functions.&lt;/span&gt;&lt;br /&gt;&lt;blockquote  style="font-family:Verdana;"&gt;&lt;code&gt;b.getl(a (&lt;span style="color: rgb(0, 0, 255);font-family:Verdana;" &gt;numlines&lt;/span&gt;(a)-1) 2)&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;out &lt;/span&gt;b&lt;/code&gt;  &lt;/blockquote&gt;&lt;span style="font-family:Verdana;"&gt;The 'getl' function first asks you for the string from which you want to get the line (variable 'a').  The second part is a little trickier; the '&lt;/span&gt;&lt;code  style="font-family:Verdana;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;numlines&lt;/span&gt;&lt;/code&gt;&lt;span style="font-family:Verdana;"&gt;' function tells you how many lines are in the string 'a', but the '-1' needs some explaining.  The 'getl' function is what is called 'zero-based' which means (it's terribly annoying and prone to 'one-off' mistakes) it starts counting at '0' not '1' just like a computer....um...ok yeah, that &lt;/span&gt;&lt;span style="font-style: italic;font-family:Verdana;" &gt;does&lt;/span&gt;&lt;span style="font-family:Verdana;"&gt; make sense now but it's still annoying.  So, it has 4 lines but the last line is 3 hence the '-1'.  So now 'b' contains the last line of 'a'.  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;Now, let's remove the line that we loaded into 'b' and put it back into 'a' but in the 2nd position.&lt;/span&gt;&lt;br /&gt;&lt;blockquote  style="font-family:Verdana;"&gt;&lt;code&gt;a.RemoveLineN(&lt;span style="color: rgb(0, 0, 255);"&gt;numlines&lt;/span&gt;(a)-1)&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 160, 0);"&gt;;;this removes the line at the end (that we just copied) so it won't be duped.&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;a.InsertLineN(b 1)&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 160, 0);"&gt;;;again zero-based function.&lt;/span&gt;&lt;/code&gt;  &lt;p&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;out &lt;/span&gt;a&lt;/code&gt;  &lt;/p&gt;  &lt;/blockquote&gt;&lt;span style="font-family:Verdana;"&gt;For the next step, let's add a new line.  This new line can come from anywhere i.e. a file, the clipboard, or text selection, but here I've just set 'b' to it and then dropped it onto the end of 'a'.&lt;/span&gt;&lt;br /&gt;&lt;blockquote  style="font-family:Verdana;"&gt;&lt;code&gt;b="Salamis|12|Telamonian Ajax"&lt;br /&gt;a.addline(b 1)&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;out &lt;/span&gt;a&lt;/code&gt;  &lt;/blockquote&gt;&lt;div  style="margin-left: 40px;font-family:Verdana;"&gt;A note about the &lt;span style="font-style: italic;"&gt;flag&lt;/span&gt; used on line two (not zero-based 80) ).  The '1' tells 'addline' to not add a 'new line' character at the end of 'a'.&lt;br /&gt;A note about flags: flags are just parameter codes for functions that allow you to modify the basic behavior of a function.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;Now let's say you want to pull out the last part of each string and take a look at it (e.g. Menelaus, Thersander, Ascalaphus, etc).  Here's how to set up the loop and grab the last section.&lt;/span&gt;&lt;br /&gt;&lt;blockquote face="Verdana"&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;rep numlines&lt;/span&gt;(a)&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;,&lt;/span&gt;b.getl(a)&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;,&lt;/span&gt;c.gett(b 2 "|[]")&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;out &lt;/span&gt;"c=%s" c&lt;/code&gt;  &lt;/blockquote&gt;&lt;span style="font-style: italic;font-family:Verdana;" &gt;Note: the commas are another way of indenting the code within the QM Editor.  However, when you copy/paste the code into another program, the tabs are replaced with commas.  If you copy the code above to your QM Editor, you'll get the commas unless you use the menu Edit -&gt; Other formats -&gt; Paste escaped option.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;Now, about the code, I'm using the '&lt;/span&gt;&lt;code  style="font-family:Verdana;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;numlines&lt;/span&gt;(a)'&lt;/code&gt;&lt;span style="font-family:Verdana;"&gt; instead of checking for the error code output from the 'getl' just as a matter of preference (I'll explain more about that in a minute).  The 'getl' is missing the line number to pull but when that value is missing, it just pulls the next line; you could use an incrementing integer but this is simpler.  If, however, there is no next line, the 'getl' function returns -1; it would be that -1 that you would check for if you didn't know exactly how many lines where in the variable.  The real money maker is the 'gett' or 'get token'.  Think of a token as a 'chunk' of the string.  To break up each line, I've used the pipe character '|' as my delimiter because it was very unlikely to show up in the data.  But I also have the '[]' within the 'gett' command in its delimiter section.   This tells QM that the last chunk of data in a line will  end at the new-line character.  Otherwise, it will grab the next line's first section (you can try it out to see how it affects the data pull).  And finally, you'll notice that through out this lesson I've been using the '&lt;/span&gt;&lt;code  style="font-family:Verdana;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;out&lt;/span&gt;&lt;/code&gt;&lt;span style="font-family:Verdana;"&gt;' command to monitor my changes in the data but I've used a modified version of this at the end to include some prefix text to identify the variable.  This technique really comes in handy when I'm debugging and vetting several variables at once and it can contain many variables on the same line as well as identifying them.&lt;br /&gt;&lt;br /&gt;So there you have it, some of the really useful string functions.  And if you really want to turn it up, you can start getting into using 'replacerx' and Regular Expression coding...not that I would know anything about that.  ;o)&lt;br /&gt;&lt;br /&gt;So have at it and I'll see you next time cause the hook always brings you back.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;BTW: Here's the entire code block to make it easy to import into the Editor (don't forget to use the Paste-Escaped option).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;blockquote style="font-family: Verdana;"&gt;&lt;code&gt;&lt;span style="color: rgb(0, 128, 240);"&gt;ClearOutput&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;str &lt;/span&gt;a b c&lt;br /&gt;b.getl(a (&lt;span style="color: rgb(0, 0, 255);"&gt;numlines&lt;/span&gt;(a)-1) 2)&lt;br /&gt;a.RemoveLineN(&lt;span style="color: rgb(0, 0, 255);"&gt;numlines&lt;/span&gt;(a)-1)&lt;br /&gt;a.InsertLineN(b 1)&lt;br /&gt;b="Salamis|12|Telamonian Ajax"&lt;br /&gt;a.addline(b 1)&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;out &lt;/span&gt;a&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;rep numlines&lt;/span&gt;(a)&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;,&lt;/span&gt;b.getl(a)&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;,&lt;/span&gt;c.gett(b 2 "|[]")&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;out &lt;/span&gt;"c=%s" c&lt;br /&gt;&lt;/code&gt;  &lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-3769968320857748501?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/3769968320857748501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=3769968320857748501' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/3769968320857748501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/3769968320857748501'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/05/lesson-4-extra-mile.html' title='Lesson 4: The Extra Mile'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-8801438043378070419</id><published>2007-05-05T18:38:00.000-05:00</published><updated>2007-05-06T14:22:08.031-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Alerts'/><category scheme='http://www.blogger.com/atom/ns#' term='Beta'/><title type='text'>NEW-NEW BETA OUT!</title><content type='html'>&lt;span style="font-family: verdana;font-family:verdana;" &gt;&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: verdana;"&gt;There was a bug in the new beta; if you have 2.2.0.6 you should upgrade ASAP (&lt;span style="font-style: italic;"&gt;turns out the predefined variables got unassigned&lt;/span&gt;).&lt;/span&gt;&lt;br /&gt;&lt;a style="font-family: verdana;" href="http://www.quickmacros.com/beta/quickmac.exe"&gt;2.2.0.7&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-8801438043378070419?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/8801438043378070419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=8801438043378070419' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/8801438043378070419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/8801438043378070419'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/05/new-beta-out.html' title='NEW-NEW BETA OUT!'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-4889196658553549657</id><published>2007-05-03T22:46:00.000-05:00</published><updated>2007-05-03T22:50:05.075-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='getsel'/><category scheme='http://www.blogger.com/atom/ns#' term='Variables'/><category scheme='http://www.blogger.com/atom/ns#' term='Lesson 4'/><category scheme='http://www.blogger.com/atom/ns#' term='getwintext'/><category scheme='http://www.blogger.com/atom/ns#' term='findreplace'/><category scheme='http://www.blogger.com/atom/ns#' term='Diet Coke'/><category scheme='http://www.blogger.com/atom/ns#' term='from'/><category scheme='http://www.blogger.com/atom/ns#' term='[]'/><category scheme='http://www.blogger.com/atom/ns#' term='mailto'/><category scheme='http://www.blogger.com/atom/ns#' term='Strings'/><category scheme='http://www.blogger.com/atom/ns#' term='setclip'/><title type='text'>Lesson 4: String Theory</title><content type='html'>&lt;span style="font-family:verdana;"&gt;Sorry, this post won't have anything to do with gravity wells, point particles, or CERN so you can keep your boson particle "foam fingers" in your truck (however, I do like me some tailgate grilling action so feel free to fire up that Grill Master 3000 and make my buffalo steak well-done ... WOOT!).  Though I can't tell you the foundation of reality or, more importantly, what's underneath reality that is so sturdy as to support reality's foundation, I can say this, "Variables are the foundation of coding" and especially so in macros.  So crack open that 12-pack of Diet Coke and toss 'em in the cooler and let's get this party started.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;To first use a variable, you'll need to declare it by telling QM what kind it is and what you want to call it.  Here's what it looks like in the wild.&lt;/span&gt;&lt;br /&gt;&lt;blockquote  style="font-family:verdana;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;str &lt;/span&gt;a&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-family:verdana;"&gt;That was easy enough but what can you DO with it?  Well, let's start by giving it some values; which can be done several different ways.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote  style="font-family:verdana;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;str &lt;/span&gt;a="anything you want"&lt;br /&gt;&lt;/blockquote&gt; &lt;div  style="margin-left: 40px;font-family:verdana;"&gt;   Note: the use of the &lt;span style="font-style: italic;"&gt;double-quotes&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;  &lt;/div&gt; &lt;blockquote  style="font-family:verdana;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;str &lt;/span&gt;a.getclip&lt;/blockquote&gt; &lt;div style="margin-left: 40px; font-family: verdana;"&gt;   This gets the contents of the clipboard.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt; &lt;blockquote  style="font-family:verdana;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;str &lt;/span&gt;a.getsel&lt;br /&gt;&lt;/blockquote&gt; &lt;div style="margin-left: 40px; font-family: verdana;"&gt;   This gets the currently selected text.&lt;br /&gt;&lt;/div&gt; &lt;blockquote  style="font-family:verdana;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;str &lt;/span&gt;a.getwintext(&lt;span style="color: rgb(51, 51, 255);"&gt;win&lt;/span&gt;)&lt;br /&gt;&lt;/blockquote&gt; &lt;div style="margin-left: 40px; font-family: verdana;"&gt;   This gets the tittle-bar text of the currently active window.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family:verdana;"&gt; Now let's put 'em into play.  Let's say you want to create a macro that will grab the url of the current web page that you are on and send an email to your buddies (cuz they don't get enough of that stuff from their moms).  In FireFox and I.E. 7, if you hit Alt-d the address bar is given the focus and the entire contents are selected.  Let's put that into a string variable and the combine it with another string variable and then copy all that to the clipboard ready to paste into an email.  Here's how we do it.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote  style="font-family:verdana;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;str &lt;/span&gt;url mesText&lt;br /&gt;mesText=&lt;br /&gt;&lt;span style="color: rgb(0, 160, 0);"&gt;;Hey guys you gotta check this out.&lt;br /&gt;;&lt;br /&gt;&lt;/span&gt;'Ad&lt;br /&gt;url.getsel&lt;br /&gt;mesText.from(mesText url)&lt;br /&gt;mesText.setclip &lt;p&gt; &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt; Now there are some strange things going on in there so let's take a look.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt; First, line one is a shorthand way of creating more than one variable on one line.  Second, the variable mesText is assigned a value rather oddly.  If you set it up like this, every line that follows the 'mesText=' line that has a &lt;span style="font-style: italic;"&gt;semi-colon &lt;/span&gt;or a &lt;span style="font-style: italic;"&gt;space&lt;/span&gt; in the front (in other words, that are marked as 'comments' in the code) are assigned as the variable value.  This allows you to set big blocks of text without it running all the way across the page and manually entering in the line-breaks (BTW: use &lt;span style="font-style: italic;"&gt;[]&lt;/span&gt; as the escape-characters for a &lt;span style="font-style: italic;"&gt;line-break&lt;/span&gt; in QM).  Moving on, we have the 'get selection' function (this gets the url).  And then, we have the 'from' function.  Now, this is a handy one.  'From' allows you to combine (concatenate) two or more string variables and or text 'chunks' that are surrounded by double-quotes.  To say it in a human language you would say, "Tack on 'url' to the end of 'mesText'."  And then it takes the new value of mesText and loads it to the clipboard.  All you have to do is:  open a new email; paste it into the body; add a subject; and address it.&lt;br /&gt;&lt;br /&gt;Ummmm....yeah....that's too much freakin' work! So, let's turn up the juice and see what shakes loose (MAN, I love quoting old 80's flicks!).&lt;br /&gt;&lt;br /&gt;&lt;blockquote  style="font-family:verdana;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;str &lt;/span&gt;url mesText mailto subj &lt;span style="color: rgb(0, 160, 0);"&gt;;;I'm creating a bunch of variables at one time&lt;/span&gt;&lt;br /&gt;mailto="mailto:Ender@battle-school.mil;Bean@battle-school.mil?subject=subHere&amp;body="&lt;br /&gt;subj.getwintext(&lt;span style="color: rgb(0, 0, 255);"&gt;win&lt;/span&gt;)&lt;br /&gt;subj.findreplace(" - Mozilla Firefox" "")&lt;span style="color: rgb(0, 160, 0);"&gt;;;I'm just pulling out the 'Mozilla Firefox' part cuz I don't need it&lt;/span&gt;&lt;br /&gt;mailto.findreplace("subHere" subj)&lt;span style="color: rgb(0, 160, 0);"&gt;;;I'm injecting the url into the subject parameter of the mailto command&lt;/span&gt;&lt;br /&gt;mesText=&lt;br /&gt;&lt;span style="color: rgb(0, 160, 0);"&gt;;Hey guys you gotta check this out.%0D%0D&lt;/span&gt;&lt;br /&gt;'Ad&lt;br /&gt;url.getsel&lt;br /&gt;mailto.from(mailto mesText url)&lt;span style="color: rgb(0, 160, 0);"&gt;;;I'm 'stringing' them all together here&lt;/span&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;run &lt;/span&gt;mailto&lt;br /&gt;&lt;/blockquote&gt;  &lt;p style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style="font-family:verdana;"&gt;Oh yeah, now that's &lt;/span&gt;&lt;span style="text-decoration: line-through;font-family:verdana;" &gt;lazy with a capital "L" baby&lt;/span&gt;&lt;span style="font-family:verdana;"&gt; efficient and helpful; besides, you've got better things to do than menial cut/paste you've got to defend the Frontier against Xur and the Ko-Dan Armada!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt; So have at it and I'll see you next time cause the hook always brings you back.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-4889196658553549657?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/4889196658553549657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=4889196658553549657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/4889196658553549657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/4889196658553549657'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/05/lesson-4-string-theory.html' title='Lesson 4: String Theory'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-6515631143280673082</id><published>2007-05-01T16:14:00.000-05:00</published><updated>2007-05-01T19:18:04.933-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Alpha'/><category scheme='http://www.blogger.com/atom/ns#' term='Alerts'/><category scheme='http://www.blogger.com/atom/ns#' term='Sneak Peeks'/><category scheme='http://www.blogger.com/atom/ns#' term='The Pou-up Menu'/><category scheme='http://www.blogger.com/atom/ns#' term='Vista'/><title type='text'>!!! ALPHA ALERT !!!</title><content type='html'>&lt;span style="font-family: verdana;"&gt;Lookout!  I just started using the new alpha of 2.2.0.6 and it's got some really nice features.&lt;br&gt;I'm not entirely sure because I can't compare to the 2.2.0.5 build but I think you will have these new (among others) soon&lt;br&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Popup menus: Expandable folders, bitmaps and more. &lt;br&gt;&lt;/li&gt;&lt;li&gt;A global hot key to show Threads dialog can be specified in Options. &lt;br&gt;&lt;/li&gt;&lt;li&gt;Vista compatibility in both 32 and 64 bit versions.&lt;/li&gt;&lt;li&gt;Macro and function properties: "Run in separate process", "Run As". &lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;The appearance of the alpha code means that the beta should be out soon; I'd say less than a week or even &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;THIS WEEK&lt;/span&gt;!     &lt;br&gt;&lt;br&gt;&lt;span style="font-family: verdana;"&gt; &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-6515631143280673082?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/6515631143280673082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=6515631143280673082' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/6515631143280673082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/6515631143280673082'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/05/lookout-i-just-started-using-new-alpha.html' title='!!! ALPHA ALERT !!!'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-6487727103981568234</id><published>2007-04-27T21:58:00.000-05:00</published><updated>2007-04-27T21:30:10.819-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Window Assignment'/><category scheme='http://www.blogger.com/atom/ns#' term='QM Help'/><category scheme='http://www.blogger.com/atom/ns#' term='Toolbar'/><category scheme='http://www.blogger.com/atom/ns#' term='The Extra Mile'/><category scheme='http://www.blogger.com/atom/ns#' term='Opacity'/><category scheme='http://www.blogger.com/atom/ns#' term='Lesson 3'/><title type='text'>Lesson 3: The Extra Mile</title><content type='html'>&lt;span style="font-family:verdana;"&gt;Ok, so now you've got your toolbar going.  How can you &lt;span style="font-style: italic;"&gt;really make this dog hunt&lt;/span&gt;?  Let's get into the config and see.&lt;br /&gt;&lt;br /&gt;If you go to your QM Editor and hit Ctl-F1, you'll open the help for QM.  This is actually an extremely well documented program and the help is always my first stop.  The first thing to do is click on the 'Index' tab and start entering 'Toolbar properties'; you'll notice that it jumps down the list as you type.  Now, take a look at the entry for 'Toolbar properties'.  We'll be doing some work in here in a bit but first open the properties of the toolbar (Ctl-p) and let's set it to open only when we have a certain window open.&lt;br /&gt;&lt;br /&gt;Here's the properties window; now choose 'window' under the 'triggers' tab and then choose 'created and active'.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/kenegray/TheMacroHookLesson3/photo#5057786488631987106"&gt;&lt;img src="http://lh6.google.com/image/kenegray/RjDeA5yuC6I/AAAAAAAAADk/Ev9DUJdbVuk/s400/Lesson%203-The%20Extra%20Mile-1.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;On the right you'll see a little icon that looks like a aiming reticle; click and drag that onto the window, who when starting up, will trigger the toolbar to open.  You'll see it fill-in a bunch of info in the 'window name' field and probably the class as well.  Edit the 'window name' field as needed as the toolbar will not open if the window tittle bar doesn't contain exactly what is in the field.  For instance, if I want the toolbar to open when FireFox is started, it won't if I leave the value 'The Macro Hook - Mozilla Firefox' in the window field.  To fix that, I'll just remove the first part and leave '&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;Mozilla Firefox' in there.  I can also use the '*' wildcard by clicking the checkbox 'Use *' and put it in the field like this &lt;/span&gt;&lt;span style="font-family:verdana;"&gt;'&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;*Mozilla Firefox'&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;.   And if you really want to let your Geek-Flag-Fly, start putting in Regular Expressions by hand or via the 'RX' button.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;Now, let's say you want to make this toolbar (which should have a few buttons on it) sit on top of the window's title bar.  Here's what we do.  Run the tool bar and right click on it.  Click on 'coordinates' and then 'top-right'.  Also, make sure that 'Auto-Select' is &lt;span style="font-style: italic;"&gt;unchecked&lt;/span&gt;.  Now adjust the size by dragging the edges around.  Once you have the size set to the way you want it, uncheck 'Sizing Border'.  Now move it into place by dragging it into place with the &lt;span style="font-weight: bold;"&gt;right mouse button&lt;/span&gt;.  Once it is set in place, it should move with the size of the window to always be next to the 'minimize' button.&lt;br /&gt;&lt;br /&gt;Here's what I'm seeing.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/kenegray/TheMacroHookLesson3/photo#5058180504636754866"&gt;&lt;img src="http://lh3.google.com/image/kenegray/RjJEXpyuC7I/AAAAAAAAADw/U0C9XV0jBGA/s400/Toolbar%206.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nice and very usable but let's see what else we can do. Open up the properties again and click on the 'Toolbar Properties' tab.  Here you can see all kinds of hacking potential (i.e. 'Shrinked width', 'Text Colour', and 'Bitmap') but let's take a look at just one for now, 'Opacity'.  I love this one!  Windows opacity can be set from 0-255 (255 being standard Widows opaque and 0 being completely invisible).  Now, set the Opacity for 150 and tab over to 'Transparent Colour' and click the button that says 'Back. Colour'.  Hit 'Ok' and close your toolbar and open it again for the changes to take effect.  Nice huh?  Now, go back to the properties and take out the value for 'Opacity' and just leave the 'b' in the 'Transparent Colour'.  Hit 'Ok' and restart your toolbar.....Even better huh?  Notice the differences in the two?  No lines just like the programmer put them there.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/kenegray/TheMacroHookLesson3/photo#5058183188991314882"&gt;&lt;img src="http://lh4.google.com/image/kenegray/RjJGz5yuC8I/AAAAAAAAAD4/QkiShk-1q7w/s400/Toolbar%207.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So now you know how to:  build a toolbar; make it look like you want; and assign it's existence to only a particular window.  There's plenty more you can do like:  use a bitmap for the background (gradients are nice for this); have them shrink out of the way till you mouse-over them; and set different icons on them.  Digg into them and you'll see all kinds of uses for them.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So have at it and I'll see you next time cause the hook always brings you back.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-6487727103981568234?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/6487727103981568234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=6487727103981568234' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/6487727103981568234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/6487727103981568234'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/04/lesson-3-extra-mile.html' title='Lesson 3: The Extra Mile'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-8007562811051083421</id><published>2007-04-26T23:06:00.000-05:00</published><updated>2007-04-26T23:08:01.561-05:00</updated><title type='text'>The Extra Mile....</title><content type='html'>&lt;span style="font-family: verdana;"&gt;The Extra Mile will be a few more days this week due to illness.&lt;br /&gt;&lt;br /&gt;Sorry.&lt;br /&gt;&lt;br /&gt;Ken&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-8007562811051083421?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/8007562811051083421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=8007562811051083421' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/8007562811051083421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/8007562811051083421'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/04/extra-mile.html' title='The Extra Mile....'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-1783560657184520919</id><published>2007-04-26T11:31:00.000-05:00</published><updated>2007-04-26T23:14:06.036-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Toolbar'/><category scheme='http://www.blogger.com/atom/ns#' term='Lesson 3'/><title type='text'>Lesson 3: The Toolbar</title><content type='html'>&lt;span style="font-family:verdana;"&gt;Ok, so we've gone over two different ways to access your macros or code quickly and easily: the Text-Sensitive Menu (TSM (which is the quickest and invisible)) and the Pop-up Menu (PuM (which is visible but only till you choose an option or cancel it).  But, there is a third that is more permanent than the PuM; it is called the Toolbar (Tb).  Of course you've seen this ever since you've opened QM as there is one connected to the QM Editor.  So, let's get into it so you can start doing more with less.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;Toolbars, Pop-up Menus, and the Text-Sensitive Menus are all about giving you ways to execute code quickly by trading off speed with volume.  If you have more than a score of text-replacements or other macros that you try to put into a TSM, you can start to loose track of them and start to reenter them having forgot you put them in there two or three months ago when you last used that particular process.  So, moving them to the PuM can help remind you of what you already have, but if you've had to categorize it with &lt;/span&gt;&lt;span style="font-family:verdana;"&gt;sub-folders and &lt;/span&gt;&lt;span style="font-family:verdana;"&gt;sub-sub-folders&lt;/span&gt;&lt;span style="font-family:verdana;"&gt; and thus it has become tiresome to keep pulling up the PuM and then navigate to what you want, then you're in the market for a toolbar.  So let's get that started.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;Create a new Tb by clicking File&gt;New&gt;New Toolbar&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-style: italic;"&gt;No screenshot for YOU; come back one lesson!&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-family:verdana;"&gt;Now, let's start dropping in some entries:  a few programs you're always using&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;; a few websites&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;; and a macro or two.  And here's the code for my quick one so you can see what they look like.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;code&gt;&lt;/code&gt;&lt;blockquote&gt;IEXPLORE &lt;span style="color: rgb(255, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;run &lt;/span&gt;"$program files$\Internet Explorer\IEXPLORE.EXE"&lt;br /&gt;WINWORD &lt;span style="color: rgb(255, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;run &lt;/span&gt;"$program files$\Microsoft Office\OFFICE11\WINWORD.EXE"&lt;br /&gt;EXCEL &lt;span style="color: rgb(255, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;run &lt;/span&gt;"$program files$\Microsoft Office\OFFICE11\EXCEL.EXE"&lt;br /&gt;-&lt;br /&gt;The Macro Hook &lt;span style="color: rgb(255, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;web &lt;/span&gt;"http://www.themacrohook.blogspot.com/"&lt;span style="color: rgb(0, 160, 0);"&gt;;;come on if John C. Dvorak can do it...!&lt;/span&gt;&lt;br /&gt;Quick Macros Forum &lt;span style="color: rgb(255, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;web &lt;/span&gt;"http://www.quickmacros.com/forum/"&lt;br /&gt;-&lt;br /&gt;One Line&lt;br /&gt;Unformat Clipboard&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;The first three entries I created from &lt;a href="http://themacrohook.blogspot.com/2007/04/lesson-2-pop-up-menu.html"&gt;last week's lesson&lt;/a&gt; on the PuM by just dragging over some exe's from my file manager.  The second group will take me to a couple of websites (again these were created by merely dragging over the icon that's in the address bar to the QM Editor).  The last two are a couple of custom macros that I built to help me out so they won't look right (or work) in your Editor but feel free to add your own there.&lt;br /&gt;&lt;br /&gt;When you first start it, you probably won't like how it looks.  Here's what I got (whoops those macro icons didn't show up...I'll fix that in the next slide; look for green triangles).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/kenegray/TheMacroHookLesson3/photo#5056821867205274146"&gt;&lt;img src="http://lh6.google.com/image/kenegray/Ri1wsi8yqiI/AAAAAAAAAC8/OrqejJD2SoA/s400/Toolbar%201.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Not very pretty, huh?  But let's pull it cherry hot from the furnace that is our desire and put it on the anvil of our will and shape it to be the beast of burden we need....(ok, so I listen to a lot of George R. Martin.....and Roy Dotrice better be reading the next book...I'm talking to you Random House!).  Let's transmogrify to the below description....(ok, so I like Calvin and Hobbes too....) it to fit this description:&lt;/span&gt;&lt;br /&gt;&lt;ul style="font-family: verdana;"&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;vertical&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;with text&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:verdana;"&gt;&lt;span&gt;If you right-click on the toolbar, you'll see this menu.  Click "Vertical" and "Show Text"&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/kenegray/TheMacroHookLesson3/photo#5056826402690738754"&gt;&lt;img src="http://lh6.google.com/image/kenegray/Ri100i8yqkI/AAAAAAAAADM/kELHKiHK888/s400/Toolbar%203.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Right-click on it again and click "Miscellaneous" and take a look at the options there.  Click "Equal Buttons" and see how it affects your Tb.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/kenegray/TheMacroHookLesson3/photo#5056827665411123794"&gt;&lt;img src="http://lh4.google.com/image/kenegray/Ri11-C8yqlI/AAAAAAAAADU/SC6g4yKWcZQ/s400/Toolbar%204.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now, just grab the lower right-hand corner of the Tb and adjust the size as you needed.  For bonus points, try out the "Auto-Shrink" option as well....(I'm not going to tell you what it does but it won't affect you in any way that you'll need to start paying attention to your spam folder to fix).&lt;br /&gt;&lt;br /&gt;So there it is, 3 lessons, three execution platforms:  No-look, Quick-look, and Always-look.  Play around and keep expanding because these machines are here for us not the other way around.&lt;br /&gt;&lt;br /&gt;So have at it and I'll see you next time cause the hook always brings you back.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-1783560657184520919?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/1783560657184520919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=1783560657184520919' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/1783560657184520919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/1783560657184520919'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/04/lesson-3-toolbar.html' title='Lesson 3: The Toolbar'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-2892232942677254265</id><published>2007-04-24T08:08:00.000-05:00</published><updated>2007-04-26T11:16:19.294-05:00</updated><title type='text'>Automation and the Crippled Masses</title><content type='html'>GAAAAAHHHH!!!!   this didn't post!....such an E-List blogger mistake!&lt;br /&gt;&lt;br /&gt;There are times when, the planets are aligned,the solstice is here, and that monkey just popped off for a very thorough shower....and this, my friend is a story about such a time.  The yin and yang of automation is summed up in one article; it reminds us that automation cuts both ways but the cutting isn't always bad....Enter Ferdy.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://worsethanfailure.com/Articles/MeaningleBneB.aspx"&gt;Meaninglessness - Worse Than Failure&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-2892232942677254265?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/2892232942677254265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=2892232942677254265' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/2892232942677254265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/2892232942677254265'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/04/automation-and-crippled-masses.html' title='Automation and the Crippled Masses'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-3517762970825948429</id><published>2007-04-17T20:55:00.000-05:00</published><updated>2007-04-18T21:26:26.195-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Text Sensitive Menu'/><category scheme='http://www.blogger.com/atom/ns#' term='The Pou-up Menu'/><category scheme='http://www.blogger.com/atom/ns#' term='Lesson 2'/><title type='text'>Lesson 2: The Pop-up Menu</title><content type='html'>Well, here here we are at lesson two and you've already reduced your annoyance and saved yourself a tonne of time with the &lt;span&gt;&lt;a href="http://themacrohook.blogspot.com/2007/04/lesson-1-text-sensitive-menu.html"&gt;Text Sensitive Menu&lt;/a&gt; &lt;/span&gt; (TSM).  And if you're like me you may have a hard time keeping track of all the items it the T.S. Menu.  Have I got just the thing for you:  the Pop-up Menu (PuM).  The PuM can hold command strings or execute macros, just like the TSM, but you can pick these items from a visual menu rather than trying to remember them.  So now that the hook has been baited, let's put it in the water and see what hits it.&lt;br /&gt;&lt;br /&gt;Create a new PuM by clicking File&gt;New&gt;New Menu&lt;br /&gt;&lt;a href="http://picasaweb.google.com/kenegray/TheMacroHookLesson2/photo#5054575992428580050"&gt;&lt;img src="http://lh3.google.com/image/kenegray/RiV2FbbsTNI/AAAAAAAAABk/zpB2Na-KfMA/s288/Popup%20Menu%201.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The syntax for the PuM is pretty straight forward.  The label (the name you want to show on the menu), then a 'space' character, then a 'colon' character, then the magic.  Let's start with all those 'text-replacements' you setup in the TSM but can't remember to use.  Since it's pretty straight forward I'll just show you what it looks like.&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;a href="http://picasaweb.google.com/kenegray/TheMacroHookLesson2/photo#5054587704804396322"&gt;&lt;img src="http://lh6.google.com/image/kenegray/RiWAvLbsTSI/AAAAAAAAACM/38P6sdg7b_s/s400/Popup%20Menu%201.5.jpg" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And here's the code (note: there are only three lines of code even though your browser may have wrapped them:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;blockquote&gt;No Thanks &lt;span style="color: rgb(255, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;outp &lt;/span&gt;"Thank you for your concern but I don't need any non-perscription v!agr4."&lt;br /&gt;Good Luck &lt;span style="color: rgb(255, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;outp &lt;/span&gt;"That is unfortunate about your current financial circumstances; I would help you, however I am already helping a wrongly deposed prince in Sierra Leone."&lt;br /&gt;PPpbbbbtttt &lt;span style="color: rgb(255, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;outp &lt;/span&gt;"Your offer is very tempting as your rates seem to be very low, however I won't do my banking with someone who can't spell 'r3f1nanc3' correctly." &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Since you have other things to do besides reply to spam all day (which I don't recommend by the way), here's another function of the PuM that will save you a tonne of time.  Launch your favorite applications from the PuM.&lt;br /&gt;&lt;br /&gt;It is insanely simple to to code the PuM to launch programs; just drag the icon into the Editor, and then....ummmm....ok, well there isn't another step.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/kenegray/TheMacroHookLesson2/photo#5054575992428580082"&gt;&lt;img src="http://lh3.google.com/image/kenegray/RiV2FbbsTPI/AAAAAAAAAB0/MB-oDqkQla8/s400/Popup%20Menu%203.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is the code that is put into the Editor when I drop the program's icon into the Editor.&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;code&gt;halo &lt;span style="color: rgb(255, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;run &lt;/span&gt;"$program files$\Microsoft Games\Halo\halo.exe"&lt;/code&gt;  &lt;/blockquote&gt;And here is what the PuM looks like when I hit the trigger for it.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/kenegray/TheMacroHookLesson2/photo#5054575992428580098"&gt;&lt;img src="http://lh3.google.com/image/kenegray/RiV2FbbsTQI/AAAAAAAAAB8/7HEt61dZkNo/s288/Popup%20Menu%204.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But after a program or two plus the text-replacements, things can get cluttered but here's how we can deal with that.  You can create Sub-Menus to organize all the entries that are related.&lt;br /&gt;&lt;br /&gt;To do this use the '&gt;' (greater than) character to let QM know that the following is the name of the Sub-Menu.  When you hit enter, the Editor automatically 'tab-indents' the lines that follow.  Now you can move the line down into the Sub-Menu like this and drop in a couple of tabs to line everything up and then end the block with a '&lt;' (less than) character so that your code looks like this.     &lt;a href="http://picasaweb.google.com/kenegray/TheMacroHookLesson2/photo#5054575992428580114"&gt;&lt;img src="http://lh3.google.com/image/kenegray/RiV2FbbsTRI/AAAAAAAAACE/pX-EEJsj_P0/s400/Popup%20Menu%205.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now you've got a place for that Text-Sensitive Menu 'run-off' that you can't seem to keep in your head.  Plus, a quick menu for your most used programs.&lt;br /&gt;&lt;br /&gt;So have at it and I'll see you next time cause the hook always brings you back.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://themacrohook.blogspot.com/2007/04/lesson-2the-extra-mile.html"&gt;Lesson 2: The Extra Mile&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-3517762970825948429?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/3517762970825948429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=3517762970825948429' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/3517762970825948429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/3517762970825948429'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/04/lesson-2-pop-up-menu.html' title='Lesson 2: The Pop-up Menu'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-2798118717979439565</id><published>2007-04-17T20:41:00.000-05:00</published><updated>2007-04-17T22:19:00.659-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Text Sensitive Menu'/><category scheme='http://www.blogger.com/atom/ns#' term='The Extra Mile'/><category scheme='http://www.blogger.com/atom/ns#' term='Macro Stacking'/><category scheme='http://www.blogger.com/atom/ns#' term='The Pou-up Menu'/><category scheme='http://www.blogger.com/atom/ns#' term='Lesson 2'/><title type='text'>Lesson 2:The Extra Mile</title><content type='html'>Well, now that you've got your menu up and going, it has probably gone all Audrey II on you and has like a 100 lines in it by now.  Like the Sub-menu, there is another way that you can further categorize the Pop-up Menu (PuM) by making several and have them tied to the specific program that you are currently using.  But the problem with a bunch of PuMs is that, you have to remember all those triggers.  So here's a plan to avoid that.  I call it "Macro Stacking".&lt;br /&gt;&lt;br /&gt;First split up your PuM items into program categories ( e.g. browsing, email, Excel actions, etc.) and create a new PuM for each category.  Now, make a new macro with the trigger you want (mouse or keyboard or second keyboard).  What you're going to do is use the "getwintext" string function to get the active window's Tittle Bar text and then use the "sel" function to determine which PuM is brought up.&lt;br /&gt;&lt;br /&gt;Here is how it is coded:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;_s.getwintext(&lt;span style="color:#0000ff;"&gt;win&lt;/span&gt;())&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;sel &lt;/span&gt;_s 2&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;case &lt;/span&gt;"*- Mozilla Firefox"&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;mac &lt;/span&gt;"Menu3"&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;case &lt;/span&gt;"Quick Macros - *"&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;mac &lt;/span&gt;"Menu2"&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;case &lt;/span&gt;"QM Help"&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;mac &lt;/span&gt;"Menu"&lt;/code&gt;  &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This is pretty straight forward but I will make a few notes.  First the '_s' is a predefined local variable for a string.  There are also numerous other predefined variables but I mostly use _s and _i (integer).  It saves a line of code by not having to declare it.  The '2' after 'sel _s' is a flag that tells QM that the values in the select case will/may contain wildcards.  You can also tell QM that the case statements need to be case insensitive with the flag 1.  Or, you can tell QM that the case statements are case insensitive AND may contain wildcards by adding the flags together and putting a 3 there.&lt;br /&gt;&lt;br /&gt;So there you have it; one macro to rule them all using 'Macro Stacking'.  Now you can make all kinds of PuMs without having to sift though all the macros/code or Sub-menus that don't apply to the situation at hand.&lt;br /&gt;&lt;br /&gt;So have at it and I'll see you next time cause the hook always brings you back.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://themacrohook.blogspot.com/2007/04/lesson-2-pop-up-menu.html"&gt;Lesson 2:The Pop-up Menu&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-2798118717979439565?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/2798118717979439565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=2798118717979439565' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/2798118717979439565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/2798118717979439565'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/04/lesson-2the-extra-mile.html' title='Lesson 2:The Extra Mile'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-6268593286489411622</id><published>2007-04-13T09:04:00.000-05:00</published><updated>2007-04-13T09:04:27.894-05:00</updated><title type='text'>Soft Coding - Worse Than Failure</title><content type='html'>&lt;a href="http://worsethanfailure.com/Articles/Soft_Coding.aspx"&gt;Soft Coding - Worse Than Failure&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I wanted to include this article from Worse Than Failure even though it doesn't seem to apply to automation per se.  It does however discuss hard-coding versus soft coding.  And in the end drags the big-wet-greasy finger of automation across the line between hard and soft coding.  Especially when you have automated your compilers and program distribution.  In the end, what's the difference between an end user going in and removing or adding a record to a database that a program uses to create output and a programmer going in and doing the same thing in the source code along with an automated compiling script and executable distribution....I'd say, "&lt;span style="font-style: italic;"&gt;Dang little, and a sight more reliable&lt;/span&gt;."&lt;br /&gt;&lt;br /&gt;Anyway, it's a good read.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-6268593286489411622?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://worsethanfailure.com/Articles/Soft_Coding.aspx' title='Soft Coding - Worse Than Failure'/><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/6268593286489411622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=6268593286489411622' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/6268593286489411622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/6268593286489411622'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/04/soft-coding-worse-than-failure.html' title='Soft Coding - Worse Than Failure'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-8438802846260766830</id><published>2007-04-10T21:29:00.000-05:00</published><updated>2007-04-10T21:35:24.996-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blog Intro'/><category scheme='http://www.blogger.com/atom/ns#' term='Format'/><title type='text'>The Format</title><content type='html'>Well, I've just posted my first lesson here on The Macro Hook.  I've laid it out differently than most.  The lessons come in two parts.  The first part is an introduction to the topic and the second takes it a bit further (thus it is called "The Extra Mile").&lt;br /&gt;&lt;br /&gt;Comments are open and I do take suggestions but I have had to limit it to registered users only...cuz MAN, there are a lot of spammers and griefers out there!!!&lt;br /&gt;&lt;br /&gt;So, enjoy and jump in on the discussions.  Future posts will certainly be affected by your input.&lt;br /&gt;&lt;br /&gt;Ken&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-8438802846260766830?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/8438802846260766830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=8438802846260766830' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/8438802846260766830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/8438802846260766830'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/04/format.html' title='The Format'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-7337597559563252574</id><published>2007-04-10T20:41:00.000-05:00</published><updated>2007-04-18T21:24:28.400-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Text Sensitive Menu'/><category scheme='http://www.blogger.com/atom/ns#' term='Escape Characters'/><category scheme='http://www.blogger.com/atom/ns#' term='Lesson 1'/><title type='text'>Lesson 1: The Text Sensitive Menu</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;In the 1st article here at The Macro Hook, I'm going to show you how to make the T.S. Menu (TSM) your friend.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;T.S. stands for "Text Sensitive" and is used for "text replacement" but that's kind of misleading to the new user.  Think of the TSM as a way to write tonnes of text with just a few keystrokes.  Let's dive in and I'll show you. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;Ok, so here's the scenario involving email but this can work for text documents or spreadsheets, or anytime you need to type the same thing over and over.  So, you have numerous people writing you; you basically want to say the same thing to each of them but don't want to write it every time.  Here's how we do it. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;Create a new TSM by going to "&lt;/span&gt;&lt;span style="text-decoration: underline;font-family:lucida grande;" &gt;F&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;ile"&gt;"&lt;/span&gt;&lt;span style="text-decoration: underline;font-family:lucida grande;" &gt;N&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;ew"&gt;"New T.S. Men&lt;/span&gt;&lt;span style="text-decoration: underline;font-family:lucida grande;" &gt;u&lt;/span&gt;&lt;span style="font-family:lucida grande;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;a href="http://picasaweb.google.com/kenegray/TheMacroHook02/photo?authkey=86xd-lQPxgE#5051972666721586338"&gt;&lt;img src="http://lh4.google.com/image/kenegray/Rhw2X7bsTKI/AAAAAAAAABQ/z6VFxtW7U9w/s400/TS%20Menu%201.jpg" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;You will notice that it automatically calls the menu "T.S. Menu" by default but the name is selected and ready for you to type in your name or you can just hit enter and accept the default name (subsequent TSM will be called " T.S. Menu2", "T.S. Menu3" etc).  The big blank box is called the "Editor"; it's where the magic happens.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:lucida grande;" &gt;Just a quick aside: the first line of your new T.S. Menu put in this code.  I'm not going to go into what this does at this time because we have enough to cover but you can look at the help file to find out more about it.&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: rgb(0, 160, 0);"&gt;&lt;blockquote&gt;/b&lt;/blockquote&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;So, lets say you want to always say, "Thanks for your input." in responding to these emails your always getting.  Here's how we do that.  In the Editor, type the "trigger text".  For example, if you want QM to type out the above response when you type "nr" (nice response), your code would look like this. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;blockquote&gt;nr &lt;span style="color: rgb(255, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;outp &lt;/span&gt;"Thanks for your input."&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;Now, we need to set your "trigger" for the TSM itself.  While in the editor, press Ctl-P to get the properties dialog (you can also get to that by right clicking the macro name in the "List").  You'll see this dialog.&lt;/span&gt;&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;a href="http://picasaweb.google.com/kenegray/TheMacroHook02/photo?authkey=86xd-lQPxgE#5051974307399093426"&gt;&lt;img src="http://lh6.google.com/image/kenegray/Rhw33bbsTLI/AAAAAAAAABY/42bzj8oth7E/s400/Popup%20Menu%202.jpg" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style="font-family:lucida grande;"&gt;Now, click the "Keyboard" item in the list of triggers.  If you hit the tab key after selecting the trigger method, it will take you to the "Hot-Key" field.  Now hit just the letter of the keyboard shortcut you want to use.  For instance, if you want your TSM trigger to be Control-Shift-t, just hit the "t" key when in the Hot-Key field and then click check boxes for Ctrl and Shift.  Now, every time you hit Ctrl-Shift-t, you have engaged the TSM and it will wait for you to hit the trigger 'nr'.  It will wait for 5 seconds for you to give it a correct trigger, at that time it will end the process.  If you hit keys that are:  not a trigger, click the mouse, or type a non-printable key such as....ummm....well, I would print them out here but they are non-printable (kind of like Schrödinger's cat so don't try to print them; you don't want to kill kittens do you?...EGAD MAN, JUST DON'T DO IT!....)....Sorry about that.  It's just that I feel very strongly about quantum keystrokes.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;So, now we're in business.  Open a document in something (I like &lt;/span&gt;&lt;a style="font-family: lucida grande;" href="http://www.context.cx/" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt;ConText&lt;/a&gt;&lt;span style="font-family:lucida grande;"&gt;) and hit your TSM trigger and then your text trigger; I'll wait for you........................Ok, good.  Nice huh?  Now lets make another that has a little more to it.  Try this. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;blockquote&gt;nr &lt;span style="color: rgb(255, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;outp &lt;/span&gt;"Thanks for your input.[]The ''Hofstadter-Moebius loop'' is actually very common in that type of computer.[][]R. Chandra" &lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:lucida grande;" &gt;Note: paste this in as one line of QM code.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;Now, go try your triggers again.....AAAhhhhh....why did it to a new line character after "input."?  Yes, you're right.  The "[]" told QM to do a new line there.  It's a very handy thing to have; it's kind of like a special escape character.  Now, did you notice the odd appearance of the double-quotes?  Well, that's a special consideration in QM (and maybe in other 3G or 4G languages too).  When you're telling QM to "output all info between the next two quotation marks", you can't have it output the quotation mark because it thinks you're trying to tell it to stop outputting the text, so, instead you use two apostrophes instead.  So, two of these ' equal one of these "&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;So there you have it; a quick and easy way to output a tonne of text with only a few keystrokes.  Only you can limit the use of this technique; you can use it in text documents, web page forms, or even to beat down Digg spammers.  80)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So have at it and I'll see you next time cause the hook always brings you back.&lt;a href="http://themacrohook.blogspot.com/2007/04/lesson-1-extra-mile.html"&gt;&lt;br /&gt;&lt;br /&gt;Lesson 1: The Extra Mile&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-7337597559563252574?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/7337597559563252574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=7337597559563252574' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/7337597559563252574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/7337597559563252574'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/04/lesson-1-text-sensitive-menu.html' title='Lesson 1: The Text Sensitive Menu'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-4790790062281538984</id><published>2007-04-10T20:40:00.000-05:00</published><updated>2007-04-17T21:49:25.704-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Text Sensitive Menu'/><category scheme='http://www.blogger.com/atom/ns#' term='The Extra Mile'/><category scheme='http://www.blogger.com/atom/ns#' term='Lesson 1'/><title type='text'>Lesson 1: The Extra Mile</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;Now that you've seen how to get the T.S. Menu (TSM) up and going, let's get into it a bit more.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:lucida grande;"&gt;Your T.S. Menu looks like this (note there are only two lines; your browser may wrap long lines):&lt;/span&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;span style="color: rgb(0, 160, 0);"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="color: rgb(0, 160, 0);"&gt;/b&lt;/span&gt;&lt;br /&gt;nr &lt;span style="color: rgb(255, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;outp &lt;/span&gt;"Thanks for your input.[]The ''Hofstadter-Moebius loop'' is actually very common in that type of computer.[][]R. Chandra"&lt;/blockquote&gt; &lt;/code&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;span style="font-family:lucida grande;"&gt;But you might also want to run your macros from the TSM as well; not a problem.  Let's say, you want to trigger your macro "Date-Time" with the trigger dt; here's how you would do that. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;blockquote&gt;dt &lt;span style="color: rgb(255, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;mac &lt;/span&gt;"Date-Time"&lt;/blockquote&gt;&lt;/code&gt;&lt;p style="font-family: lucida grande;"&gt;Now, when you invoke the TSM and hit 'dt', your macro runs instead of outputting text.  But here's a nice little trick that you can do in QM.  If you don't want to create a new macro, just code it in the TSM.   &lt;/p&gt;&lt;p style="font-family: lucida grande;"&gt;In QM you can run all the lines together by separating them with a semi-colon ';' instead of carriage-returns.  Take your Date-Time macro for example.  Here's your code:&lt;/p&gt;&lt;p&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;  str &lt;/span&gt;a&lt;br /&gt;a.time("%c")&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;outp &lt;/span&gt;a&lt;/blockquote&gt;&lt;/code&gt;  &lt;/p&gt;&lt;span style="font-family:lucida grande;"&gt;Nice and compact; easy to maintain; and efficient.  Good job; you're really getting the hang of this.  Anyway, so you want to have this code in the TSM rather than making a whole new macro; no problem.  Here's how you're going to do that.  Replace the 'carriage-returns' with a 'semi-colon' like this: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;str &lt;/span&gt;a&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;;&lt;/span&gt;&lt;/span&gt;a.time("%c")&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;outp &lt;/span&gt;a&lt;/blockquote&gt;&lt;/code&gt;  &lt;p style="font-family: lucida grande;"&gt;Now put that into your trigger line in your TSM like this:&lt;/p&gt;&lt;p&gt;&lt;code&gt;&lt;blockquote&gt;dt &lt;span style="color: rgb(255, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;str &lt;/span&gt;a;a.time("%c");&lt;span style="color: rgb(0, 0, 255);"&gt;outp &lt;/span&gt;a&lt;/blockquote&gt;&lt;/code&gt;  &lt;/p&gt;&lt;span style="font-family:lucida grande;"&gt;And there you have it.  It makes complicated macros and functions a real bear-cat to debug or even to know what it's for, but it can be done and it can be better sometimes than making all kinds of new macros clogging up your List in the main window.&lt;br /&gt;&lt;br /&gt;So have at it and I'll see you next time cause the hook always brings you back.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://themacrohook.blogspot.com/2007/04/lesson-1-text-sensitive-menu.html"&gt;Lesson 1: The Text Sensitive Menu&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-4790790062281538984?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/4790790062281538984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=4790790062281538984' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/4790790062281538984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/4790790062281538984'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/04/lesson-1-extra-mile.html' title='Lesson 1: The Extra Mile'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-1501997356670682099</id><published>2007-04-07T13:54:00.001-05:00</published><updated>2007-06-04T23:11:42.692-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='indignation'/><category scheme='http://www.blogger.com/atom/ns#' term='Automation Theory'/><category scheme='http://www.blogger.com/atom/ns#' term='Blog Intro'/><title type='text'>I'M HAVING AN INDIGNATION MEETING</title><content type='html'>I was talking to a guy at work the other day and we were discussing automation.  He was curious as to why I was so gun-ho about automation; I told him that my driving force behind it was "INDIGNATION"!!  If we can send men to the moon with a slide-ruler, then surely there's a way that I can keep from typing the same lines over and over and over (no, I still do not administrate that system contact ITS). &lt;br /&gt;&lt;br /&gt;Yes, it is obvious &lt;span style="font-style: italic;"&gt;why &lt;/span&gt;you would want to automate processes but as this is the beginning of this blog I'll go ahead and outline them so we can all start on the same page.  Besides, I'm betting I have one benefit that you haven't thought of yet.  80)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The first reason&lt;/span&gt; is to free me up to do tasks that the computer isn't good at, like:  what do I want to have for second breakfast or does this keyboard make me look fat?  You know, the important stuff.   &lt;span style="font-weight: bold;"&gt;The second reason&lt;/span&gt; is, things are done more accurately when you let the computer do it.  Of course, you have to have accurate code in there to begin with but that's what this blog is about.   &lt;span style="font-weight: bold;"&gt;The third reason&lt;/span&gt; is so that the tasks get done even if I'm not there.  No training, no frantic calls from the nearly dead cellphone trying to explain how to get a report published.  And  &lt;span style="font-weight: bold;"&gt;the fourth reason&lt;/span&gt; is that you only have to be polite once.  It doesn't matter if this is the 17th time you've answered the question since you got into work (and you haven't even had elevenses yet!).  You can be as mad as you want and cuss the users till you pass out and hit your head on your faux targh-leather messenger bag but your email response is just as sweet as honey-laced ambrosia served by a Jewish grand-mother who hasn't seen you in too long.&lt;br /&gt;&lt;br /&gt;So, as we approach these up coming code examples remember to gird your loins with your best winter kilt of Indignation and drink deep the cup of Vexation and remember "If you do something more than once, you're a sucker." &lt;br /&gt;&lt;span style="font-weight: bold;"&gt;MAKE THE FREAKIN' COMPUTER DO IT!!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-1501997356670682099?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://themacrohook.blogspot.com/feeds/1501997356670682099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6542386313627723887&amp;postID=1501997356670682099' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/1501997356670682099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/1501997356670682099'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/04/im-having-indignation-meeting.html' title='I&apos;M HAVING AN INDIGNATION MEETING'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6542386313627723887.post-1187468102047710609</id><published>2007-04-06T21:42:00.000-05:00</published><updated>2007-04-06T22:57:16.878-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blog Intro'/><title type='text'>AAAaaannnnd We're Off!!</title><content type='html'>So here it is.  My first post on a blog that I hope makes me a million bucks (USD).  In the end isn't that what all us bloggers are out for (yeah, I'm talkin' to you Johnny C. D.!)?  That way we'll have more time to sit in a St. Louis Bread Co. and eat chocolate-chip muffins and &lt;s&gt;surf&lt;/s&gt;...I mean, &lt;span style="font-style: italic;"&gt;work&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;So, here's a little synopsis of what I'm trying to do (besides make that million); I've been working in a scripting and execution environment called &lt;a href="http://quickmacros.com/"&gt;Quick Macros&lt;/a&gt; for several years now.  I'm doing all kinds of really handy things in it and I want to help make your life easier (and make a million bucks).  Each post will be about a concept or procedure to help you understand QM better and help you free yourself up more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6542386313627723887-1187468102047710609?l=themacrohook.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/1187468102047710609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6542386313627723887/posts/default/1187468102047710609'/><link rel='alternate' type='text/html' href='http://themacrohook.blogspot.com/2007/04/aaaaaannnnd-were-off.html' title='AAAaaannnnd We&apos;re Off!!'/><author><name>Ken</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry></feed>
