Turns out the answer is just to not use hotstrings at all. Thanks Rohwedder for the gui idea, that works great. Made a few changes to it so now all options are the same size, just looks better. Also highlights the focused one under the mouse or you can use up and down arrows to select one and hit enter. This works almost perfect now. A few little glitches but overall its great. Input hook works way better than hotsrings.
Note: "Advanced Hotsring Display Thing" was my way of saying intelisense before I knew what that was.
Turn it on with ctrl 1 and off with ctrl 2. Try it out in notepad because it can't find the carrot position on all windows.
Code: Select all
global Drug_List_2
BackColor := "0xFF6363"
OnMessage(0x0200, "Mouse_Move")
OnMessage(0x0201, "On_Left_Click")
Medication_InputHook := InputHook("V", "{Space}{Enter}")
Medication_InputHook.OnEnd := Func("InputHook_End")
Medication_InputHook.OnChar := Func("InputHook_Char")
Medication_InputHook.KeyOpt("{Backspace}", "N")
Medication_InputHook.OnKeyDown := Func("Backspace_Func")
Drug_List =
(
Buprenorphine/Naloxone (Suboxone)
Carisoprodol (Soma)
Celecoxib (Celebrex)
Codeine
Cyclobenzaprine (Flexeril)
Diclofenac (Voltaren)
Fentanyl
Hydrocodone
Hydrocodone/APAP (Vicodin)
Ibuprofen (Advil)
Indomethacin
Lidocaine
Meloxicam (Mobic)
Methadone
Methocarbamol (Robaxin)
Morphine (MS Contin)
Naproxen (Aleve)
Oxycodone (OxyContin)
Pentosan (Elmiron)
Sumatriptan (Imitrex)
Tramadol (Ultram)
Benazepril (Lotensin)
Captopril (Capoten)
Enalapril (Vasotec)
Fosinopril (Monopril)
Lisinopril (Prinivil, Zestril)
Moexipril (Univasc)
Perindopril (Aceon)
Quinapril (Accupril)
Ramipril (Altace)
Trandolapril (Mavik)
Azilsartan (Edarbi)
Candesartan (Atacand)
Eprosartan (Teveten)
Irbesartan (Avapro)
Losartan (Cozaar)
Olmesartan (Benicar)
Telmisartan (Micardis)
Valsartan (Diovan)
Apixaban (Eliquis)
Dabigatran (Pradaxa)
Edoxaban (Savaysa)
Heparin
Rivaroxaban (Xarelto)
Warfarin (Coumadin)
Aspirin
Clopidogrel (Plavix)
Dipyridamole (Persantine)
Prasugrel (Effient)
Ticagrelor (Brilinta)
Acebutolol (Sectral)
Atenolol (Tenormin)
Betaxolol (Kerlone)
Bisoprolol/Hydrochlorothiazide (Ziac)
Bisoprolol (Zebeta)
Metoprolol (Lopressor, Toprol XL)
Nadolol (Corgard)
Propranolol (Inderal)
Sotalol (Betapace)
Carvedilol (Coreg, Coreg CR)
Labetalol (Normodyne, Trandate)
Amlodipine (Norvasc)
Diltiazem (Cardizem, Tiazac)
Felodipine (Plendil)
Nifedipine (Adalat, Procardia)
Nimodipine (Nimotop)
Nisoldipine (Sular)
Verapamil (Calan, Verelan)
Digoxin (Lanoxin)
Atorvastatin (Lipitor)
Fluvastatin (Lescol)
Lovastatin (Mevacor)
Pitavastatin (Livalo)
Pravastatin (Pravachol)
Rosuvastatin (Crestor)
Simvastatin (Zocor)
Niacin
Ezetimibe (Zetia)
Ezetimibe/Simvastatin (Vytorin)
Acetazolamide (Diamox)
Amiloride (Midamor)
Bumetanide (Bumex)
Chlorothiazide (Diuril)
Chlorthalidone (Hygroton)
Furosemide (Lasix)
Hydro-chlorothiazide (Esidrix, Hydrodiuril)
Indapamide (Lozol)
Metalozone (Zaroxolyn)
Spironolactone (Aldactone)
Torsemide (Demadex)
Isosorbide dinitrate (Isordil)
Isosorbide mononitrate (Imdur)
Hydralazine (Apresoline)
Nitroglycerin (Nitro Bid, Nitro Stat)
Minoxidil
Alprazolam (Xanax)
Chlordiazepoxide (Librium)
Clorazepate (Tranxene)
Diazepam (Valium)
Halazepam (Paxipam)
Lorzepam (Ativan)
Oxazepam (Serax)
Prazepam (Centrax)
Quazepam (Doral)
Clonazepam (Klonopin)
Zolpidem (Ambien, Edluar, Intermezzo)
Zaleplon (Sonata)
Suvorexant (Belsomra)
Ramelteon (Rozerem)
Eszopiclone (Lunesta)
Doxepine (Silenor)
Amitriptyline (Elavil)
Mirtazapine (Remeron SolTab, Remeron)
Nortriptyline (Aventyl, Pamelor)
Trazodone (Desyrel)
Citalopram (Cipramil)
Dapoxetine (Priligy)
Escitalopram (Cipralex)
Fluoxetine (Prozac, Oxactin)
Fluvoxamine (Faverin)
Paroxetine (Seroxat)
Sertraline (Lustral)
Vortioxetine (Brintellix)
Methylphenidate (Concerta, Quillivant XR, Ritalin)
Dexmethylphenidate (Focalin XR)
Atomoxetine (Strattera)
Dextroamphetamine (Dexedrine)
Amphetamine Sulfate (Evekeo)
Amphetamine/Dextroamphetamine (Adderall XR, Adderall IR)
Prednisone
Tacrolimus (Prograf)
Cyclosporine (Neoral)
Mycophenolate Mofetil (CellCept)
Imuran (Azathioprine)
Rapamune (Rapamycin, Sirolimus)
Rosiglitazone (Avandia)
Pioglitazone (Actos)
Acarbose (Precose)
Miglitol (Glyset)
Colesevelam (Welchol)
Bromocriptine (Cycloset)
Nateglinide (Starlix)
Repaglinide (Prandin)
Glimepiride (Amaryl)
Glimepiride/Pioglitazone (Duetact)
Gliclazide
Glipizide
Glipizide ER (Glipizide XL, Glucotrol XL)
Glipizide/Metformin (Metaglip)
Glyburide (Micronase, Glynase, Diabeta)
Glyburide/Metformin (Glucovance)
Metformin (Axpinet, Diagemet, Glucient, Glucophage, Metabet)
Bexaglifloxin (Brenzavvy)
Canagliflozin (Invokana)
Dapagliflozin (Farxiga)
Empagliflozin (Jardiance)
Ertugliflozin (Steglatro)
Dulaglutide (Trulicity)
Exenatide (Byetta)
Exenatide ER (Bydureon)
Liraglutide (Victoza)
Lixisenatide (Adlyxin)
Semaglutide (Ozempic)
Alogliptin (Nesina)
Linagliptin (Tradjenta)
Saxagliptin (Onglyza)
Sitagliptin (Januvia)
Teriflunomide (Aubagio)
Dimethyl Fumarate (Tecfidera)
Diroximel Fumarate (Vumerity)
Monomethyl Fumarate (Bafiertam)
Fingolimod (Gilenya)
Siponimod (Mayzent)
Ozanimod (Zeposia)
Ponesimod (Ponvory)
Amiodarone (Cordarone, Pacerone)
Flecainide (Tambocor)
Procainamide (Procan, Procanbid)
Propafenone (Rythmol)
Quinidine
Tocainide (Tonocarid)
Lamotrigine (Lamictal)
Carbamazepine (Tegretol, Curatil)
Valproate (Dyzantil, Epilim, Episenta, Epival)
Levetiracetam (Keppra, Desitrend)
Topiramate (Topamax)
Brivaracetam
)
Loop, Parse, Drug_List, `n
{
RegExMatch(A_LoopField, "iO)(\w+(?:(\s|\/)\w+)?)", Generic_Pat)
Drug_Generic_Tag := Generic_Pat.Value(1)
if (A_Index = 1)
Drug_List_2.= Drug_Generic_Tag
else
Drug_List_2.= "`n" Drug_Generic_Tag
RegExMatch(A_LoopField, "iO)(?:\()(.*)(?:\))", Brand_List_Pat)
Current_Drug_Brand_List := Brand_List_Pat.Value(1)
if (Current_Drug_Brand_List != "")
{
Brand_Array := StrSplit(Current_Drug_Brand_List , ", ")
for each, Brand in Brand_Array
{
Drug_Brand_Tag := RegExReplace(A_LoopField, "(\w*(?:.\w*)?)\s\((.*)\)", Brand " ($1)")
Drug_List_2.= "`n" Drug_Brand_Tag
}
}
}
Sort, Drug_List_2, U
Drugs := StrSplit(Drug_List_2, "`n")
Drug_Menu:
Critical
EditControls := {}
Edit_Widths := []
Edit_Controls := []
Gui, Drugs_GUI: Destroy
Gui, Drugs_GUI:-Caption +Toolwindow +AlwaysOnTop +E0x08000000
Gui, Drugs_GUI:Margin, 0, 0
Gui, Drugs_GUI:Color, 0x254C5A, 0x254C5A
Gui, Drugs_GUI:font, s13 bold
global Length := StrLen(Medication_InputHook.Input)
if (Length = 0) || if (Medication_InputHook.Input = "")
return
Loop, Parse, Drug_List_2, `n
{
if (Medication_InputHook.Input = SubStr(A_LoopField, 1, StrLen(Medication_InputHook.Input)))
{
Gui, Drugs_GUI: Add, Edit, cWhite vE%A_Index% hwndHED, %A_LoopField%
SetFocusedBkColor(HED, BackColor)
GuiControlGet, Edit_Hwnd, Drugs_GUI: Hwnd , E%A_Index%
Edit_Controls.Push(Edit_Hwnd)
GuiControlGet, Edit_Pos, Drugs_GUI: Pos , E%A_Index%
Edit_Widths.Push(Edit_PosW)
Highest_Number := Max(Edit_Widths*)
for index, Edit_Control in Edit_Controls
GuiControl, Drugs_GUI: Move, %Edit_Control%, W%Highest_Number%
}
}
OnMessage(0x0133, "SetFocusedBkColor")
CoordMode, Caret , Screen
Caret_Y := A_CaretY + (A_ScreenHeight/36)
if (A_CaretY != "")
Gui, Drugs_GUI:Show, x%A_CaretX% y%Caret_Y% NA, Drugs_GUI
WinGet, Drugs_GUI_ID , ID, Drugs_GUI
GuiControl, Drugs_GUI: Focus, Edit1
return
^1::
Medication_InputHook.Start()
return
^2::
Critical, Off
Medication_InputHook.Stop()
return
InputHook_End(ih){
KeyName := ih.EndKey
Reason := ih.EndReason
if (KeyName = "Enter") && if WinExist("Drugs_GUI")
{
ControlGetFocus, Focused_Ctrl , Drugs_GUI,
GuiControlGet, Focused_Ctrl_Text ,Drugs_GUI: , %Focused_Ctrl%,
SendInput, % "{Backspace " Length + 1 "}" Focused_Ctrl_Text
}
Gui, Drugs_GUI: Destroy
if (Reason != "Stopped") ;so it doesnt resart every time you stop it, allows you to actually turn it off
ih.Start()
}
InputHook_Char(ih, char){
Current_String := ih.Input
Loop, Parse, Drug_List_2, `n
{
if (Current_String = SubStr(A_LoopField, 1, StrLen(Current_String)))
{
gosub, Drug_Menu
return
}
}
Gui, Drugs_GUI: Destroy
}
Backspace_Func(ih, char){
gosub, Drug_Menu
}
Active_Control(Window_Title){
ControlGetFocus, OutputVar, %Window_Title%
return OutputVar
}
#IfWinExist, Drugs_GUI
~LButton::
MouseGetPos, , , MouseWin, ctrl
if (MouseWin != Drugs_GUI_ID) || if (ctrl ~= "Edit\d+") = false
Gui, Drugs_GUI: Destroy
return
Up::
GuiControlGet, Focused_Control, Drugs_GUI: FocusV
RegExMatch(Focused_Control, "iO)(\d+)", Control_Num_Pat)
Control_Num := Control_Num_Pat.Value(1)
--Control_Num
GuiControl, Drugs_GUI: Focus, E%Control_Num%
return
Down::
GuiControlGet, Focused_Control, Drugs_GUI: FocusV
RegExMatch(Focused_Control, "iO)(\d+)", Control_Num_Pat)
Control_Num := Control_Num_Pat.Value(1)
++Control_Num
GuiControl, Drugs_GUI: Focus, E%Control_Num%
return
#IfWinExist,
On_Left_Click(wParam, lParam, msg, hwnd){
Global
if WinExist("Drugs_GUI")
{
Medication_InputHook.Stop()
ControlGetFocus, Focused_Ctrl , Drugs_GUI,
GuiControlGet, Focused_Ctrl_Text ,Drugs_GUI: , %Focused_Ctrl%,
SendInput, % "{Backspace " Length "}" Focused_Ctrl_Text
Gui, Drugs_GUI: Destroy
Medication_InputHook.Start()
}
}
Mouse_Move(wParam, lParam, msg, hwnd){
MouseGetPos,,,,ctrl
GuiControlGet, CtrlHwnd, Hwnd , %ctrl%
if (ctrl ~= "Edit\d+") && if WinExist("Drugs_GUI")
GuiControl, Drugs_GUI: Focus, %CtrlHwnd%
}
SetFocusedBkColor(wParam := "", lParam := "", msg := "", hwnd := ""){
Static Controls := {}
If (msg && hwnd) ; system call: wParam = HDC, lParam = HWND
{
If Controls.HasKey(lParam)
{
If (lParam = DllCall("GetFocus", "UPtr"))
{
Controls[lParam, "Invalidated"] := False
DllCall("SetBkColor", "Ptr", wParam, "UInt", Controls[lParam, "Color"])
Return Controls[lParam, "Brush"]
}
Else If !Controls[lParam, "Invalidated"]
{
Controls[lParam, "Invalidated"] := True
DllCall("InvalidateRect", "Ptr", lParam, "Ptr", 0, "UInt", 1)
}
}
}
Else ; setup call: W = HWND, lParam = color
{
If DllCall("IsWindow", "Ptr", wParam)
{
If Controls.HasKey(wParam)
{
DllCall("DeleteObject", "Ptr", Controls[wParam, "Brush"])
Controls.Delete(wParam)
}
If (lParam <> "") && ((EditColor := SwapRB(lParam)) <> "")
{
Controls[wParam, "Color"] := EditColor
Controls[wParam, "Brush"] := DllCall("CreateSolidBrush", "UInt", EditColor, "Uptr")
Controls[wParam, "Invalidated"] := True
}
DllCall("RedrawWindow", "Ptr", wParam, "Ptr", 0, "Ptr", 0, "UInt", 0x0405, "UInt")
}
}
}
SwapRB(Color){ ; converts RGB to BGR and vice versa
Return ((Color & 0xFF0000) >> 16) | (Color & 0x00FF00) | ((Color & 0x0000FF) << 16)
}