2019-09-05 00:26:26 +08:00
# pragma once
# include <optional>
2019-12-17 01:36:52 +08:00
# include <string>
2019-09-05 00:26:26 +08:00
# include <Windows.h>
2019-12-10 06:57:09 +08:00
# include <string>
2020-01-25 05:36:01 +08:00
# include <memory>
2019-09-05 00:26:26 +08:00
// Returns RECT with positions of the minmize/maximize buttons of the given window.
// Does not always work, since some apps draw custom toolbars.
std : : optional < RECT > get_button_pos ( HWND hwnd ) ;
// Gets position of given window.
std : : optional < RECT > get_window_pos ( HWND hwnd ) ;
// Gets mouse postion.
std : : optional < POINT > get_mouse_pos ( ) ;
2020-02-07 01:04:10 +08:00
2019-11-18 17:29:56 +08:00
// Gets window ancestor (usualy the window we want to do stuff with), filtering out all "non standard" windows like the taskbar, etc. and provide the app process path
2020-01-18 06:38:41 +08:00
struct WindowAndProcPath {
HWND hwnd = nullptr ;
std : : wstring process_path ;
2019-11-18 17:29:56 +08:00
} ;
WindowAndProcPath get_filtered_base_window_and_path ( HWND window ) ;
2020-02-07 01:04:10 +08:00
// Gets active window, filtering out all "non standard" windows like the taskbar, etc.
HWND get_filtered_active_window ( ) ;
2019-09-17 19:45:49 +08:00
2019-09-05 00:26:26 +08:00
// Calculate sizes
int width ( const RECT & rect ) ;
int height ( const RECT & rect ) ;
// Compare rects
bool operator < ( const RECT & lhs , const RECT & rhs ) ;
// Moves and/or resizes small_rect to fit inside big_rect.
RECT keep_rect_inside_rect ( const RECT & small_rect , const RECT & big_rect ) ;
// Initializes and runs windows message loop
int run_message_loop ( ) ;
void show_last_error_message ( LPCWSTR lpszFunction , DWORD dw ) ;
2020-01-18 06:38:41 +08:00
enum WindowState {
UNKNONW ,
MINIMIZED ,
MAXIMIZED ,
SNAPED_TOP_LEFT ,
SNAPED_LEFT ,
SNAPED_BOTTOM_LEFT ,
SNAPED_TOP_RIGHT ,
SNAPED_RIGHT ,
SNAPED_BOTTOM_RIGHT ,
RESTORED
2019-09-05 00:26:26 +08:00
} ;
WindowState get_window_state ( HWND hwnd ) ;
2019-10-04 00:42:18 +08:00
// Returns true if the current process is running with elevated privileges
bool is_process_elevated ( ) ;
// Drops the elevated privilages if present
bool drop_elevated_privileges ( ) ;
2019-10-07 17:12:44 +08:00
2019-12-17 01:36:52 +08:00
// Run command as elevated user, returns true if succeeded
bool run_elevated ( const std : : wstring & file , const std : : wstring & params ) ;
// Run command as non-elevated user, returns true if succeeded
bool run_non_elevated ( const std : : wstring & file , const std : : wstring & params ) ;
2020-01-10 01:17:42 +08:00
// Run command with the same elevation, returns true if succedded
bool run_same_elevation ( const std : : wstring & file , const std : : wstring & params ) ;
2019-10-07 17:12:44 +08:00
// Get the executable path or module name for modern apps
std : : wstring get_process_path ( DWORD pid ) noexcept ;
// Get the executable path or module name for modern apps
std : : wstring get_process_path ( HWND hwnd ) noexcept ;
2019-10-15 01:22:14 +08:00
std : : wstring get_product_version ( ) ;
2019-12-11 23:32:40 +08:00
std : : wstring get_module_filename ( HMODULE mod = nullptr ) ;
std : : wstring get_module_folderpath ( HMODULE mod = nullptr ) ;
2019-12-17 01:36:52 +08:00
// Get a string from the resource file
std : : wstring get_resource_string ( UINT resource_id , HINSTANCE instance , const wchar_t * fallback ) ;
// Wrapper for getting a string from the resource file. Returns the resource id text when fails.
// Requires that
// extern "C" IMAGE_DOS_HEADER __ImageBase;
// is added to the .cpp file.
2020-01-15 07:00:05 +08:00
# define GET_RESOURCE_STRING(resource_id) get_resource_string(resource_id, reinterpret_cast<HINSTANCE>(&__ImageBase), L#resource_id)
2020-01-25 05:36:01 +08:00
// Helper class for various COM-related APIs, e.g working with security descriptors
template < typename T >
struct typed_storage
{
std : : unique_ptr < char [ ] > _buffer ;
inline explicit typed_storage ( const DWORD size ) :
_buffer { std : : make_unique < char [ ] > ( size ) }
{
}
inline operator T * ( )
{
return reinterpret_cast < T * > ( _buffer . get ( ) ) ;
}
} ;
template < typename Callable >
struct on_scope_exit
{
Callable _f ;
on_scope_exit ( Callable f ) :
_f { std : : move ( f ) } { }
~ on_scope_exit ( )
{
_f ( ) ;
}
2020-01-24 23:26:44 +08:00
} ;