I know this topic has been discussed a million times

However all the discussions I have found are related to programs run on mobile devices. With PC, you have to cater to very low resolution (800x600) as well as very high resolution (1900x1080), the later is more than twice the size of former. In addition, my GUI is not simply buttons and controls, it's basically a "canvas" which calculates the location of mouse cursor while inputs are fired, and based on the location of cursor do different things, so I have to take into consideration the difference between cursor position and widget's locationPosition.
I have following options:
1. make the GUI (canvas) size smaller than 800x600 so at the lowest resolution it doesn't go outside the screen. I don't really like this approach because high resolution users will suffer a tiny canvas.
2. Calculate a scale number based on the current screen resolution, and then resize all widgets using this scaler, and scale the result of all math calculation in the code as well. This is a big effort and I'm not sure if it's the best way to do it.
I see some other options such as changing the size of the rect on the camera, which essentially zooms in or out on the widgets, is this a good method? but I guess my biggest concern is how to recalculate the translation between cursor position (which is in respect to screensize) and widget's localPosition (which is in respect to the UI camera)? Currently I just subtract the cursor position by half of the screen length/width to match the localPositino of widgets.
Thanks!