I can relate... in fact, I got so frustrated that I tried out a program called AutoKey that allows you to make your own hotkeys by writing scripts.
Feel free to borrow, modify and repost your better versions if you'd like. Note that you'll definitely have to modify the screen coordinates if you're not using 1920x1080.
Haven't used this on Clarke in case there have been any changes to the GUI.
Steps to install
1. Install autokey
2. Create empty file called (for example) Stellaris.ahk
3. Copy in script and then rightclick 'run script'
Here are the keys:
Key - Action
u - Please select the square the cursor is over, and automatically upgrade to the first upgrade option
Shift-u - Please upgrade the square, but let me choose the upgrade (e.g. Which type of lab)
Shift-C - Please clear the blocker
q - Scroll up the right window
e - Scroll down the right window
1-9 - Please select this planet (right window needs to already be scrolled up, and you may want to change this to alt-1-9 if you want to preserve the game's use of the 1-9 chars)
I don't normally do slaving races because I'm an extremely nice person, but I suppose some of you degenerates could also add in some purge/enslave hotkeys as well.
Enjoy!
<<<<<<<<<<<<<<<< Script starts below this line >>>>>>>>>>>>>>>>>>>>>>>>
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
u::
MouseGetPos, xpos, ypos
MouseClick, Left, 818, 780
sleep 200
MouseClick, Left, 751, 485
Sleep 100
MouseMove, xpos, ypos, 0
Return
+U:
MouseGetPos, xpos, ypos
MouseClick, Left, 818, 780
Sleep 100
MouseMove, xpos, ypos, 0
Return
+C::
MouseGetPos, xpos, ypos
MouseClick, Left, 816, 430
Sleep 50
MouseMove, xpos, ypos, 0
Return
q::
MouseGetPos, xpos, ypos
MouseMove, 1789, 245
Sleep 100
MouseClick, WheelUp, , ,30,0
Sleep 100
MouseMove, xpos, ypos, 0
Return
e::
MouseGetPos, xpos, ypos
MouseMove, 1789, 245
Sleep 100
MouseClick, WheelDown, , ,30,0
Sleep 100
MouseMove, xpos, ypos, 0
Return
1::
MouseGetPos, xpos, ypos
MouseClick, Left, 1789, 245
Sleep 50
MouseMove, xpos, ypos, 0
Return
2::
MouseGetPos, xpos, ypos
MouseClick, Left, 1790, 285
Sleep 50
MouseMove, xpos, ypos, 0
Return
3::
MouseGetPos, xpos, ypos
MouseClick, Left, 1795, 329
Sleep 50
MouseMove, xpos, ypos, 0
Return
4::
MouseGetPos, xpos, ypos
MouseClick, Left, 1795, 366
Sleep 50
MouseMove, xpos, ypos, 0
Return
5::
MouseGetPos, xpos, ypos
MouseClick, Left, 1800, 411
Sleep 50
MouseMove, xpos, ypos, 0
Return
6::
MouseGetPos, xpos, ypos
MouseClick, Left, 1795, 453
Sleep 50
MouseMove, xpos, ypos
Return
7::
MouseGetPos, xpos, ypos
MouseClick, Left, 1790, 495
Sleep 50
MouseMove, xpos, ypos
Return
8::
MouseGetPos, xpos, ypos
MouseClick, Left, 1783, 539
Sleep 50
MouseMove, xpos, ypos
Return
9::
MouseGetPos, xpos, ypos
MouseClick, Left, 1789, 576
Sleep 50
MouseMove, xpos, ypos
Return