Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2bc3cd1f42 | ||
|
|
372e36a467 | ||
|
|
7d5757f392 | ||
|
|
dac3acf7e2 | ||
|
|
552ec1e6cd | ||
|
|
f26c4dc676 | ||
|
|
6e528fc2bc | ||
|
|
c76af865fa | ||
|
|
9ef44f5770 | ||
|
|
222fdfdc5f | ||
|
|
7ab3c3ca4c | ||
|
|
b60b380fb5 | ||
|
|
7d153848d6 | ||
|
|
9afb711bb6 | ||
|
|
01b1bb3d9c | ||
|
|
9b8b4fa0a1 | ||
|
|
d0197c145a | ||
|
|
0a522d9bfa | ||
|
|
86b0662860 | ||
|
|
66f3c56fbc | ||
|
|
300f317707 | ||
|
|
40b69c1a5b | ||
|
|
e726f39d07 | ||
|
|
2ad80d29d3 | ||
|
|
dfa3d38e0e | ||
|
|
170f3c6afb | ||
|
|
b387261131 | ||
|
|
fba0d434ff | ||
|
|
2f694ba0a5 | ||
|
|
999a22c9eb | ||
|
|
47072a9a68 | ||
|
|
61872118d1 | ||
|
|
22496f4b84 | ||
|
|
4ad283d469 | ||
|
|
1e30a84390 | ||
|
|
b6ea682bf7 | ||
|
|
e01e7810e0 | ||
|
|
40396be5d2 | ||
|
|
b8ac484af3 | ||
|
|
20b879184a | ||
|
|
f1615987e5 | ||
|
|
30842217fc | ||
|
|
6ed452b16e | ||
|
|
16e06748e3 | ||
|
|
d823c0b7f5 | ||
|
|
e5812a27db | ||
|
|
d4552f9390 | ||
|
|
49dc3d2c6d | ||
|
|
8b5586af8a | ||
|
|
5a8ca8b6ab | ||
|
|
56a0ca744e | ||
|
|
62adb5501b | ||
|
|
c03f3bd589 | ||
|
|
d38754634b | ||
|
|
ca04226a3d | ||
|
|
c480afc668 | ||
|
|
021c490d26 | ||
|
|
1949f32d23 | ||
|
|
ee47b25884 | ||
|
|
a85ef3da1d | ||
|
|
b7dc54bfb3 | ||
|
|
8ad06b978d | ||
|
|
31255c5ea2 | ||
|
|
f874198014 | ||
|
|
122251ebbd | ||
|
|
eb09fe6a36 | ||
|
|
93646c5689 | ||
|
|
4442eb02f6 | ||
|
|
020f00bee4 | ||
|
|
42a502c8f7 | ||
|
|
ec15cca83f | ||
|
|
b38f29c84e | ||
|
|
2ed7c05179 | ||
|
|
fd4e094c7b | ||
|
|
6222d3f4f7 | ||
|
|
788acce558 | ||
|
|
8115af0ef1 | ||
|
|
c2ab63ffc6 | ||
|
|
edd8cd01a5 | ||
|
|
26754953d1 | ||
|
|
7f3678f54f | ||
|
|
96250f329e | ||
|
|
08c30f3cb1 | ||
|
|
a2a9b8bfe0 | ||
|
|
604e50593e | ||
|
|
dc161af309 | ||
|
|
d539ca6afe | ||
|
|
2905190ccf | ||
|
|
bdc262464f | ||
|
|
70b0d8ce98 | ||
|
|
7de9bfed77 | ||
|
|
96d5b5e910 | ||
|
|
bd942b61e7 | ||
|
|
8c4b0eb53d | ||
|
|
3de6201497 | ||
|
|
62d7a69689 | ||
|
|
9d4de85af0 | ||
|
|
47c1b12b87 | ||
|
|
4e0c282491 | ||
|
|
47fddb086c | ||
|
|
fb828727c7 | ||
|
|
52a92754c0 | ||
|
|
3c1e45135f | ||
|
|
58529a95ff | ||
|
|
a1a84f6cf2 | ||
|
|
8a44faf446 | ||
|
|
bb8be872e4 | ||
|
|
aa92952073 | ||
|
|
ab7c58e6a5 | ||
|
|
8d0e88f4b2 | ||
|
|
3598ac7359 | ||
|
|
2b1438368c | ||
|
|
ae6fe447a5 | ||
|
|
3a336785eb | ||
|
|
590b20964a | ||
|
|
6bdb10c294 | ||
|
|
bd4d78d882 | ||
|
|
a83b924516 | ||
|
|
e33e390900 | ||
|
|
e0cd71fdf4 | ||
|
|
2967358e3e | ||
|
|
167a2caaa4 | ||
|
|
76182e9dea | ||
|
|
de66753977 | ||
|
|
75b929613d | ||
|
|
b4d140e98f | ||
|
|
10885ed1ac | ||
|
|
98f81cca30 | ||
|
|
414d124648 | ||
|
|
8c6d447191 | ||
|
|
1ad3214988 | ||
|
|
a7ddb74fcc | ||
|
|
4570b8e25d | ||
|
|
307e24e4d2 | ||
|
|
0b5e558617 | ||
|
|
0ee1101086 | ||
|
|
f0943579ce | ||
|
|
2b6e12f974 | ||
|
|
2d29d5c130 | ||
|
|
1fb2877710 | ||
|
|
a17dd6ba66 | ||
|
|
d3b65c5ddb | ||
|
|
8eab41baf9 | ||
|
|
90f44d45e1 | ||
|
|
0f594d545b | ||
|
|
7117f624db | ||
|
|
703874f24c | ||
|
|
bf4cb78734 | ||
|
|
5024274146 | ||
|
|
0489521dc4 | ||
|
|
3abb0be33d | ||
|
|
6b27c6e361 | ||
|
|
e7335ee5c9 | ||
|
|
578b761622 | ||
|
|
e96a169d6f | ||
|
|
a5241961d0 | ||
|
|
01c37691e6 | ||
|
|
5879ab3d7b | ||
|
|
9fbb4d5dc1 | ||
|
|
d365662f4b | ||
|
|
e4f3df62f0 | ||
|
|
fc468a6673 | ||
|
|
663595ceb7 | ||
|
|
6202625cf3 | ||
|
|
8e6abd090d | ||
|
|
03409b9150 | ||
|
|
77815aca70 | ||
|
|
020f272417 | ||
|
|
df3adbd2ed | ||
|
|
b516f6671c | ||
|
|
32de0fdbd6 | ||
|
|
fd4fd6e409 | ||
|
|
d9e539bb29 | ||
|
|
766ba10796 | ||
|
|
0b024d74d5 | ||
|
|
b9d5466c5f | ||
|
|
e85c2cbcdd | ||
|
|
b249fc7930 | ||
|
|
2558b2c04e | ||
|
|
9db901f2b1 | ||
|
|
3dae0a837a | ||
|
|
30d5bf51e0 | ||
|
|
5a05e270c3 | ||
|
|
4d8eae2b13 | ||
|
|
27a2d315eb | ||
|
|
a556f2f0d0 | ||
|
|
b7897f14d4 | ||
|
|
f868669fce | ||
|
|
e9fdc10086 | ||
|
|
df994a1fa3 | ||
|
|
8ae20c7884 | ||
|
|
bd0c265ab5 | ||
|
|
8a84139f8a | ||
|
|
1ddcf89ac0 | ||
|
|
a712be3e63 | ||
|
|
839837b895 | ||
|
|
d99eeb6b1b | ||
|
|
8f99b38021 | ||
|
|
b79f9c97cf | ||
|
|
4b7283604c | ||
|
|
b144c50765 | ||
|
|
ca6ec9feee | ||
|
|
f5e4a6b339 | ||
|
|
31337c0b22 | ||
|
|
25056c7bf1 | ||
|
|
0c6cdd7c68 | ||
|
|
78a6dde32f | ||
|
|
f682c1c29d | ||
|
|
fd186b22c0 | ||
|
|
567076ca3a | ||
|
|
e402607580 | ||
|
|
9397e930df | ||
|
|
fa0d9132c1 | ||
|
|
e41dd2ae1d | ||
|
|
727ba47832 | ||
|
|
884354af45 | ||
|
|
e5a3156903 | ||
|
|
12d3247303 | ||
|
|
c15f6089f6 | ||
|
|
4afd7b01a3 | ||
|
|
c5f07b25e2 | ||
|
|
aad4338bdc | ||
|
|
495fa56e8a | ||
|
|
e4ba79ba86 | ||
|
|
2ee53333de | ||
|
|
ca6d4a30b9 | ||
|
|
1d024c2039 | ||
|
|
82ce45547d | ||
|
|
4cdd0e54eb | ||
|
|
7f63e71dc7 | ||
|
|
831ae9ed83 | ||
|
|
a2b342dc24 | ||
|
|
b45b054aa4 | ||
|
|
c05095a53f | ||
|
|
4ba06541b3 | ||
|
|
001b7eb3df | ||
|
|
8808d7c489 | ||
|
|
76c66e0a2a | ||
|
|
41c1a970ec | ||
|
|
9041ecc017 | ||
|
|
c01b7aadc6 | ||
|
|
55f2a75ee0 | ||
|
|
86ce6c619f | ||
|
|
3dbcb989fa | ||
|
|
42f95c8f1f | ||
|
|
98504351cd | ||
|
|
9c109b86bf | ||
|
|
dde18917f9 | ||
|
|
5d9194dc53 | ||
|
|
7bcdceb695 | ||
|
|
21e98dbdd2 | ||
|
|
83bb4b62a2 | ||
|
|
4bb2fb3665 | ||
|
|
73092de928 | ||
|
|
2195e3a26d | ||
|
|
18fd04fbc6 | ||
|
|
16ca96c10c | ||
|
|
9b9ddf82f3 | ||
|
|
1bf7aed58e | ||
|
|
2aa8fe9352 | ||
|
|
cb6e4f3a4f | ||
|
|
11a15d0371 | ||
|
|
a4f4e39248 | ||
|
|
f28fccccae | ||
|
|
6698551c9a | ||
|
|
9883a420e1 | ||
|
|
cd60860975 | ||
|
|
1b3e9080d8 | ||
|
|
3bea1224aa | ||
|
|
5b7790b825 | ||
|
|
cb27211d56 | ||
|
|
3af7df38fb | ||
|
|
62745f56df | ||
|
|
a083b2b8e7 | ||
|
|
ba1c56ae9c | ||
|
|
cdc68739ab | ||
|
|
78cdf77b56 | ||
|
|
bdcb89a3ed | ||
|
|
f7ca4b9832 | ||
|
|
af91991709 | ||
|
|
b0aaeb12f8 | ||
|
|
2976697f5c | ||
|
|
0bbe11b55f | ||
|
|
6cb6122389 | ||
|
|
7b97821a19 | ||
|
|
69f81c72da | ||
|
|
be2ae6e046 | ||
|
|
73146bfcaa | ||
|
|
330119559d | ||
|
|
c58d8b059f | ||
|
|
48e8fcf5ad | ||
|
|
c09db1761a | ||
|
|
278a5e70f3 | ||
|
|
9351644c7e | ||
|
|
e26bb62c39 | ||
|
|
53389cf92c | ||
|
|
46eeceb1ab | ||
|
|
12531816c2 | ||
|
|
e479218109 | ||
|
|
feec9e8b5c | ||
|
|
5022f7e847 | ||
|
|
93f8f36f43 | ||
|
|
f2b9abda0b | ||
|
|
5ac3d76a92 | ||
|
|
748cf3aa91 | ||
|
|
24c4136bd3 | ||
|
|
fa8f14712c | ||
|
|
52a9d6da9c | ||
|
|
4a4782cc0c | ||
|
|
8ecd467e4a | ||
|
|
f05184acc9 | ||
|
|
826620c130 | ||
|
|
1ed0df7ecb | ||
|
|
d8988ad4ab | ||
|
|
f6056bf4e9 | ||
|
|
eb68cd60ad | ||
|
|
2518129bc8 | ||
|
|
0063caad95 | ||
|
|
eec2f16c5c | ||
|
|
094e54d311 | ||
|
|
e11deb188e | ||
|
|
1415816527 | ||
|
|
d8c4fec3ad | ||
|
|
2404f73eb3 | ||
|
|
285f777969 | ||
|
|
fa9115c359 | ||
|
|
e836c54ab9 | ||
|
|
d582442f2e | ||
|
|
8ad4a195c3 | ||
|
|
c081ab18c0 | ||
|
|
5da595cda2 | ||
|
|
2cf11fe6e7 | ||
|
|
08bb38509b | ||
|
|
7d2884824d | ||
|
|
33b9895810 | ||
|
|
a9caf4ad81 | ||
|
|
f5500a8a70 | ||
|
|
9454483d0d | ||
|
|
3d52bdc752 | ||
|
|
66b4ce6c63 | ||
|
|
90e5c36b92 | ||
|
|
8e2bfae213 | ||
|
|
eb53d369ff | ||
|
|
c0f2f1f1cf | ||
|
|
66b3077bae | ||
|
|
ef7bfa965f | ||
|
|
23ac963542 | ||
|
|
309734dfb8 | ||
|
|
2b0dc3c0ae | ||
|
|
870576ecd6 | ||
|
|
21adcba44a | ||
|
|
ee150aa087 | ||
|
|
c8562621bf | ||
|
|
7a1850cc30 | ||
|
|
6e9e99248b | ||
|
|
68dbbaa017 | ||
|
|
1bd9ac34e2 | ||
|
|
11cb0030d1 | ||
|
|
8f2c293f74 | ||
|
|
a761e56758 | ||
|
|
6c8069eac4 | ||
|
|
721fb03d4e | ||
|
|
093f788dd0 | ||
|
|
491d14cc64 | ||
|
|
4444f8a840 | ||
|
|
035da83842 | ||
|
|
19e0f716f5 | ||
|
|
9e12ba5510 | ||
|
|
e3383c544c | ||
|
|
591b4c191e | ||
|
|
db227cd2d2 | ||
|
|
afd351982d | ||
|
|
5418f926b8 | ||
|
|
81f1824902 | ||
|
|
303a9cefd5 | ||
|
|
46afcae0e8 | ||
|
|
d5aaa8ebdc | ||
|
|
17f8c870ad | ||
|
|
475e33d290 | ||
|
|
549402c7d8 | ||
|
|
2e50491da7 | ||
|
|
0205bfd3c8 | ||
|
|
a329ec7010 | ||
|
|
e754f71a9a | ||
|
|
1eba2a725d | ||
|
|
b42329cf76 | ||
|
|
8fc9c530ed | ||
|
|
3e4c9de1c2 | ||
|
|
9fc6e9f1a8 | ||
|
|
229f59fb72 | ||
|
|
931d5654d6 | ||
|
|
0a328229b1 | ||
|
|
10886a62ac | ||
|
|
aa5963b8e8 | ||
|
|
326648c1f5 | ||
|
|
8871efc2b7 | ||
|
|
e5c5b9016d | ||
|
|
070e3a5aa1 | ||
|
|
2eea9f6419 |
@@ -1,242 +0,0 @@
|
||||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
|
||||
# top-most EditorConfig file
|
||||
root = true
|
||||
|
||||
# Unix-style newlines with a newline ending every file
|
||||
[*]
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
|
||||
# Matches multiple files with brace expansion notation
|
||||
# Set default charset
|
||||
[*]
|
||||
charset = utf-8
|
||||
|
||||
# Tab indentation (no size specified)
|
||||
[Makefile]
|
||||
indent_style = tab
|
||||
|
||||
[*.{js,json,xaml,axaml}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
# c# 文件
|
||||
[*.cs]
|
||||
|
||||
#### Core EditorConfig 选项 ####
|
||||
|
||||
# 缩进和间距
|
||||
indent_size = 4
|
||||
indent_style = space
|
||||
tab_width = 4
|
||||
|
||||
# 新行首选项
|
||||
end_of_line = crlf
|
||||
insert_final_newline = false
|
||||
|
||||
#### .NET 编码约定 ####
|
||||
|
||||
# 组织 Using
|
||||
dotnet_separate_import_directive_groups = false
|
||||
dotnet_sort_system_directives_first = false
|
||||
file_header_template = unset
|
||||
|
||||
# this. 和 Me. 首选项
|
||||
dotnet_style_qualification_for_event = false:suggestion
|
||||
dotnet_style_qualification_for_field = false
|
||||
dotnet_style_qualification_for_method = false:suggestion
|
||||
dotnet_style_qualification_for_property = false:suggestion
|
||||
|
||||
# 语言关键字与 bcl 类型首选项
|
||||
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
|
||||
dotnet_style_predefined_type_for_member_access = true:suggestion
|
||||
|
||||
# 括号首选项
|
||||
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity
|
||||
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity
|
||||
dotnet_style_parentheses_in_other_operators = never_if_unnecessary
|
||||
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity
|
||||
|
||||
# 修饰符首选项
|
||||
dotnet_style_require_accessibility_modifiers = never
|
||||
|
||||
# 表达式级首选项
|
||||
dotnet_style_coalesce_expression = true
|
||||
dotnet_style_collection_initializer = true
|
||||
dotnet_style_explicit_tuple_names = true
|
||||
dotnet_style_null_propagation = true
|
||||
dotnet_style_object_initializer = true
|
||||
dotnet_style_operator_placement_when_wrapping = beginning_of_line
|
||||
dotnet_style_prefer_auto_properties = true
|
||||
dotnet_style_prefer_compound_assignment = true
|
||||
dotnet_style_prefer_conditional_expression_over_assignment = true
|
||||
dotnet_style_prefer_conditional_expression_over_return = true
|
||||
dotnet_style_prefer_inferred_anonymous_type_member_names = true
|
||||
dotnet_style_prefer_inferred_tuple_names = true
|
||||
dotnet_style_prefer_is_null_check_over_reference_equality_method = true
|
||||
dotnet_style_prefer_simplified_boolean_expressions = true
|
||||
dotnet_style_prefer_simplified_interpolation = true
|
||||
|
||||
# 字段首选项
|
||||
dotnet_style_readonly_field = true
|
||||
|
||||
# 参数首选项
|
||||
dotnet_code_quality_unused_parameters = all
|
||||
|
||||
# 禁止显示首选项
|
||||
dotnet_remove_unnecessary_suppression_exclusions = none
|
||||
|
||||
#### c# 编码约定 ####
|
||||
|
||||
# var 首选项
|
||||
csharp_style_var_elsewhere = true
|
||||
csharp_style_var_for_built_in_types = true
|
||||
csharp_style_var_when_type_is_apparent = true
|
||||
|
||||
# Expression-bodied 成员
|
||||
csharp_style_expression_bodied_accessors = true
|
||||
csharp_style_expression_bodied_constructors = false
|
||||
csharp_style_expression_bodied_indexers = true
|
||||
csharp_style_expression_bodied_lambdas = true
|
||||
csharp_style_expression_bodied_local_functions = false
|
||||
csharp_style_expression_bodied_methods = false
|
||||
csharp_style_expression_bodied_operators = false
|
||||
csharp_style_expression_bodied_properties = true
|
||||
|
||||
# 模式匹配首选项
|
||||
csharp_style_pattern_matching_over_as_with_null_check = true
|
||||
csharp_style_pattern_matching_over_is_with_cast_check = true
|
||||
csharp_style_prefer_not_pattern = true
|
||||
csharp_style_prefer_pattern_matching = true
|
||||
csharp_style_prefer_switch_expression = true
|
||||
|
||||
# Null 检查首选项
|
||||
csharp_style_conditional_delegate_call = true
|
||||
|
||||
# 修饰符首选项
|
||||
csharp_prefer_static_local_function = true
|
||||
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async
|
||||
|
||||
# 代码块首选项
|
||||
csharp_prefer_braces = false
|
||||
csharp_prefer_simple_using_statement = true
|
||||
|
||||
# 表达式级首选项
|
||||
csharp_prefer_simple_default_expression = true
|
||||
csharp_style_deconstructed_variable_declaration = true
|
||||
csharp_style_implicit_object_creation_when_type_is_apparent = true
|
||||
csharp_style_inlined_variable_declaration = true
|
||||
csharp_style_pattern_local_over_anonymous_function = true
|
||||
csharp_style_prefer_index_operator = true
|
||||
csharp_style_prefer_range_operator = true
|
||||
csharp_style_throw_expression = true
|
||||
csharp_style_unused_value_assignment_preference = discard_variable
|
||||
csharp_style_unused_value_expression_statement_preference = discard_variable
|
||||
|
||||
# "using" 指令首选项
|
||||
csharp_using_directive_placement = outside_namespace
|
||||
|
||||
#### C# 格式规则 ####
|
||||
|
||||
# 新行首选项
|
||||
csharp_new_line_before_catch = true
|
||||
csharp_new_line_before_else = true
|
||||
csharp_new_line_before_finally = true
|
||||
csharp_new_line_before_members_in_anonymous_types = true
|
||||
csharp_new_line_before_members_in_object_initializers = true
|
||||
csharp_new_line_before_open_brace = all
|
||||
csharp_new_line_between_query_expression_clauses = true
|
||||
|
||||
# 缩进首选项
|
||||
csharp_indent_block_contents = true
|
||||
csharp_indent_braces = false
|
||||
csharp_indent_case_contents = true
|
||||
csharp_indent_case_contents_when_block = true
|
||||
csharp_indent_labels = one_less_than_current
|
||||
csharp_indent_switch_labels = true
|
||||
|
||||
# 空格键首选项
|
||||
csharp_space_after_cast = false
|
||||
csharp_space_after_colon_in_inheritance_clause = true
|
||||
csharp_space_after_comma = true
|
||||
csharp_space_after_dot = false
|
||||
csharp_space_after_keywords_in_control_flow_statements = true
|
||||
csharp_space_after_semicolon_in_for_statement = true
|
||||
csharp_space_around_binary_operators = before_and_after
|
||||
csharp_space_around_declaration_statements = false
|
||||
csharp_space_before_colon_in_inheritance_clause = true
|
||||
csharp_space_before_comma = false
|
||||
csharp_space_before_dot = false
|
||||
csharp_space_before_open_square_brackets = false
|
||||
csharp_space_before_semicolon_in_for_statement = false
|
||||
csharp_space_between_empty_square_brackets = false
|
||||
csharp_space_between_method_call_empty_parameter_list_parentheses = false
|
||||
csharp_space_between_method_call_name_and_opening_parenthesis = false
|
||||
csharp_space_between_method_call_parameter_list_parentheses = false
|
||||
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
|
||||
csharp_space_between_method_declaration_name_and_open_parenthesis = false
|
||||
csharp_space_between_method_declaration_parameter_list_parentheses = false
|
||||
csharp_space_between_parentheses = false
|
||||
csharp_space_between_square_brackets = false
|
||||
|
||||
# 包装首选项
|
||||
csharp_preserve_single_line_blocks = true
|
||||
csharp_preserve_single_line_statements = true
|
||||
|
||||
#### 命名样式 ####
|
||||
|
||||
# 命名规则
|
||||
|
||||
dotnet_naming_rule.interface_should_be_以_i_开始.severity = suggestion
|
||||
dotnet_naming_rule.interface_should_be_以_i_开始.symbols = interface
|
||||
dotnet_naming_rule.interface_should_be_以_i_开始.style = 以_i_开始
|
||||
|
||||
dotnet_naming_rule.类型_should_be_帕斯卡拼写法.severity = suggestion
|
||||
dotnet_naming_rule.类型_should_be_帕斯卡拼写法.symbols = 类型
|
||||
dotnet_naming_rule.类型_should_be_帕斯卡拼写法.style = 帕斯卡拼写法
|
||||
|
||||
dotnet_naming_rule.非字段成员_should_be_帕斯卡拼写法.severity = suggestion
|
||||
dotnet_naming_rule.非字段成员_should_be_帕斯卡拼写法.symbols = 非字段成员
|
||||
dotnet_naming_rule.非字段成员_should_be_帕斯卡拼写法.style = 帕斯卡拼写法
|
||||
|
||||
# 符号规范
|
||||
|
||||
dotnet_naming_symbols.interface.applicable_kinds = interface
|
||||
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||
dotnet_naming_symbols.interface.required_modifiers =
|
||||
|
||||
dotnet_naming_symbols.类型.applicable_kinds = class, struct, interface, enum
|
||||
dotnet_naming_symbols.类型.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||
dotnet_naming_symbols.类型.required_modifiers =
|
||||
|
||||
dotnet_naming_symbols.非字段成员.applicable_kinds = property, event, method
|
||||
dotnet_naming_symbols.非字段成员.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
|
||||
dotnet_naming_symbols.非字段成员.required_modifiers =
|
||||
|
||||
# 命名样式
|
||||
|
||||
dotnet_naming_style.帕斯卡拼写法.required_prefix =
|
||||
dotnet_naming_style.帕斯卡拼写法.required_suffix =
|
||||
dotnet_naming_style.帕斯卡拼写法.word_separator =
|
||||
dotnet_naming_style.帕斯卡拼写法.capitalization = pascal_case
|
||||
|
||||
dotnet_naming_style.以_i_开始.required_prefix = I
|
||||
dotnet_naming_style.以_i_开始.required_suffix =
|
||||
dotnet_naming_style.以_i_开始.word_separator =
|
||||
dotnet_naming_style.以_i_开始.capitalization = pascal_case
|
||||
|
||||
# IDE0010: 添加缺失的事例
|
||||
dotnet_diagnostic.IDE0010.severity = none
|
||||
|
||||
# IDE0011: 添加大括号
|
||||
dotnet_diagnostic.IDE0011.severity = none
|
||||
|
||||
# IDE0040: 添加可访问性修饰符
|
||||
dotnet_diagnostic.IDE0040.severity = none
|
||||
|
||||
# IDE0130: 命名空间与文件夹结构不匹配
|
||||
dotnet_style_namespace_match_folder = false
|
||||
|
||||
# IDE0130: 命名空间与文件夹结构不匹配
|
||||
dotnet_diagnostic.IDE0130.severity = none
|
||||
@@ -1,63 +0,0 @@
|
||||
###############################################################################
|
||||
# Set default behavior to automatically normalize line endings.
|
||||
###############################################################################
|
||||
* text=auto
|
||||
|
||||
###############################################################################
|
||||
# Set default behavior for command prompt diff.
|
||||
#
|
||||
# This is need for earlier builds of msysgit that does not have it on by
|
||||
# default for csharp files.
|
||||
# Note: This is only used by command line
|
||||
###############################################################################
|
||||
#*.cs diff=csharp
|
||||
|
||||
###############################################################################
|
||||
# Set the merge driver for project and solution files
|
||||
#
|
||||
# Merging from the command prompt will add diff markers to the files if there
|
||||
# are conflicts (Merging from VS is not affected by the settings below, in VS
|
||||
# the diff markers are never inserted). Diff markers may cause the following
|
||||
# file extensions to fail to load in VS. An alternative would be to treat
|
||||
# these files as binary and thus will always conflict and require user
|
||||
# intervention with every merge. To do so, just uncomment the entries below
|
||||
###############################################################################
|
||||
#*.sln merge=binary
|
||||
#*.csproj merge=binary
|
||||
#*.vbproj merge=binary
|
||||
#*.vcxproj merge=binary
|
||||
#*.vcproj merge=binary
|
||||
#*.dbproj merge=binary
|
||||
#*.fsproj merge=binary
|
||||
#*.lsproj merge=binary
|
||||
#*.wixproj merge=binary
|
||||
#*.modelproj merge=binary
|
||||
#*.sqlproj merge=binary
|
||||
#*.wwaproj merge=binary
|
||||
|
||||
###############################################################################
|
||||
# behavior for image files
|
||||
#
|
||||
# image files are treated as binary by default.
|
||||
###############################################################################
|
||||
#*.jpg binary
|
||||
#*.png binary
|
||||
#*.gif binary
|
||||
|
||||
###############################################################################
|
||||
# diff behavior for common document formats
|
||||
#
|
||||
# Convert binary document formats to text before diffing them. This feature
|
||||
# is only available from the command line. Turn it on by uncommenting the
|
||||
# entries below.
|
||||
###############################################################################
|
||||
#*.doc diff=astextplain
|
||||
#*.DOC diff=astextplain
|
||||
#*.docx diff=astextplain
|
||||
#*.DOCX diff=astextplain
|
||||
#*.dot diff=astextplain
|
||||
#*.DOT diff=astextplain
|
||||
#*.pdf diff=astextplain
|
||||
#*.PDF diff=astextplain
|
||||
#*.rtf diff=astextplain
|
||||
#*.RTF diff=astextplain
|
||||
@@ -0,0 +1,65 @@
|
||||
---
|
||||
name: "(English)Bug Report \U0001F41B"
|
||||
about: Create a report to help us improve
|
||||
title: "\U0001F41B[BUG] Please enter a title"
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## Please check each item in the following list carefully
|
||||
- [ ] I have searched and found no similar issues
|
||||
- [ ] Have searched the documentation and found no relevant content
|
||||
- [ ] I have tried to use the latest version, but the problem still exists
|
||||
- [ ] The official version is used (no replacement and modification of the installation directory program files)
|
||||
|
||||
<!--
|
||||
Before posting, try searching Issues to see if your issue has already been raised.
|
||||
Describe the bug in detail so that everyone can understand it, please be sure that what you are posting is a bug, if you are not sure, please post a Question
|
||||
Don't forget to fill in the title, which should be a short description of the problem
|
||||
-->
|
||||
|
||||
### 🐛 Description
|
||||
<!--
|
||||
Describe the problem in detail
|
||||
-->
|
||||
|
||||
|
||||
### 📷 Steps to Reproduce
|
||||
|
||||
<!--
|
||||
Clearly describe the reproduction steps so that others can see the problem
|
||||
Ensure that the above steps are 100% reproducible on most devices, if possible, to pinpoint the cause of the problem
|
||||
-->
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
### 📄 Log Information
|
||||
<!--
|
||||
|
||||
```
|
||||
- Path to the folder where the log files are located
|
||||
- Microsoft Store ```%USERPROFILE%\AppData\Local\Packages\4651ED44255E.47979655102CE_k6txddmbb6c52\LocalCache\Logs```
|
||||
- Windows ```\Logs``` or ```%Tmp%\Steam++\Logs```
|
||||
- macOS ```~/Library/Caches/Steam++/Logs```
|
||||
- Linux ```$XDG_CACHE_HOME/Steam++/Logs``` or ```$HOME/.cache/Steam++/Logs```
|
||||
- Android ```/data/data/net.steampp.app/cache/Logs```
|
||||
Your log content
|
||||
```
|
||||
|
||||
-->
|
||||
|
||||
### 🖼 Screenshots
|
||||
|
||||
<!--
|
||||
Screenshots can be posted here
|
||||
-->
|
||||
|
||||
|
||||
### 🚑 Other Information
|
||||
- Processor architecture: <!-- x64 / x86 / arm64 -->
|
||||
- System version number: <!-- example Windows 10.19042.844(see winver) / macOS Monterey 12 / Ubuntu 20.04.2 LTS -->
|
||||
- Download channels: <!-- Microsoft Store / Official Website / Github / AppStore / xx netdisk -->
|
||||
- Program version: <!-- 2.8.4 -->
|
||||
- Does it contain a standalone runtime: <!-- with_runtime or without fde in the file name -->
|
||||
@@ -1,36 +1,64 @@
|
||||
---
|
||||
name: Bug Report 🐛
|
||||
about: 创建 Bug 报告以帮助我们改进 / Create a report to help us improve
|
||||
title: "🐛[BUG] "
|
||||
name: "(Simplified Chinese)Bug Report \U0001F41B"
|
||||
about: 创建 Bug 报告以帮助我们改进
|
||||
title: "\U0001F41B[BUG] 请输入标题"
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
### 🐛 描述(Description)
|
||||
## 请认真检查以下清单中的每一项
|
||||
- [ ] 已经搜索过,没有发现类似的 issue
|
||||
- [ ] 已经搜索过文档,没有发现相关内容
|
||||
- [ ] 已经尝试使用过最新版,问题依旧存在
|
||||
- [ ] 使用的是官方版本(未替换及修改过安装目录程序文件)
|
||||
|
||||
<!--
|
||||
详细地描述 bug,让大家都能理解
|
||||
发布前请先尝试在 Issues 内搜索一下你的问题是否已经被提出过,
|
||||
详细地描述 bug,让大家都能理解,请一定确定你所要发布的内容是一个 Bug,如果不确定请发 Question
|
||||
别忘了填写标题,标题要简短的描述问题
|
||||
-->
|
||||
|
||||
### 📷 复现步骤(Steps to Reproduce)
|
||||
### 🐛 描述
|
||||
<!--
|
||||
详细的描述该问题
|
||||
-->
|
||||
|
||||
|
||||
### 📷 复现步骤
|
||||
|
||||
<!--
|
||||
清晰描述复现步骤,让别人也能看到问题
|
||||
确保上述步骤尽可能能够在大多数设备上 100% 复现,以便定位问题原因
|
||||
-->
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
### 📄 [异常/日志]信息([Exception/Log] Information)
|
||||
### 📄 日志信息
|
||||
<!--
|
||||
```
|
||||
- 日志文件所在文件夹路径
|
||||
- Microsoft Store ```%USERPROFILE%\AppData\Local\Packages\4651ED44255E.47979655102CE_k6txddmbb6c52\LocalCache\Logs```
|
||||
- Windows ```\Logs``` or ```%Tmp%\Steam++\Logs```
|
||||
- macOS ```~/Library/Caches/Steam++/Logs```
|
||||
- Linux ```$XDG_CACHE_HOME/Steam++/Logs``` or ```$HOME/.cache/Steam++/Logs```
|
||||
- Android ```/data/data/net.steampp.app/cache/Logs```
|
||||
你的日志内容
|
||||
```
|
||||
|
||||
### 🚑 基本信息(Basic Information)
|
||||
-->
|
||||
|
||||
- 程序版本(Program Version):
|
||||
- 系统版本号(OS Version): <!-- example Windows 10.19042.844(see winver) -->
|
||||
|
||||
### 🖼 截图(Screenshots)
|
||||
### 🖼 截图
|
||||
|
||||
<!--
|
||||
截图可以贴在这里
|
||||
-->
|
||||
|
||||
### 🚑 其他信息
|
||||
|
||||
- 处理器体系结构:<!-- x64 / x86 / arm64 -->
|
||||
- 系统版本号:<!-- example Windows 10.19042.844(see winver) / macOS Monterey 12 / Ubuntu 20.04.2 LTS -->
|
||||
- 下载渠道:<!-- 微软商店 / 官网 / Github / AppStore / xx网盘 -->
|
||||
- 程序版本:<!-- 2.8.4 -->
|
||||
- 是否包含独立运行时:<!-- 文件名中带有 with_runtime 或 不包含 fde -->
|
||||
@@ -1,26 +0,0 @@
|
||||
---
|
||||
name: Feature request 👑
|
||||
about: 对程序的需求或建议 / Suggest an idea for program
|
||||
title: "👑[Enhancement] "
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
### 🥰 需求描述(Description)
|
||||
|
||||
<!--
|
||||
详细地描述需求,让大家都能理解
|
||||
-->
|
||||
|
||||
### 🧐 解决方案(Solution)
|
||||
|
||||
<!--
|
||||
如果你有解决方案,在这里清晰地阐述
|
||||
-->
|
||||
|
||||
### 🚑 其他信息(Other Information)
|
||||
|
||||
<!--
|
||||
如截图等其他信息可以贴在这里
|
||||
-->
|
||||
@@ -0,0 +1,37 @@
|
||||
---
|
||||
name: "(English)Question \U0001F9D0"
|
||||
about: Questions about using the program or need help
|
||||
title: "\U0001F9D0[Question] Please enter a title"
|
||||
labels: question
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## Please check each item in the following list carefully
|
||||
- [ ] I have searched and found no similar issues
|
||||
- [ ] Have searched the documentation and found no relevant content
|
||||
- [ ] I have tried to use the latest version, but the problem still exists
|
||||
- [ ] The official version is used (no replacement and modification of the installation directory program files)
|
||||
|
||||
<!--
|
||||
Before posting, please try searching for your question in Issuse to see if it has already been asked.
|
||||
Don't forget to fill in the title, which should be a short description of the Question
|
||||
-->
|
||||
|
||||
### 🧐 Description
|
||||
|
||||
<!--
|
||||
Describe the Question in detail so that everyone can understand it
|
||||
-->
|
||||
|
||||
### 🚑 Other Information
|
||||
|
||||
<!--
|
||||
Additional information such as screenshots can be posted here
|
||||
-->
|
||||
|
||||
- Processor architecture: <!-- x64 / x86 / arm64 -->
|
||||
- System version number: <!-- example Windows 10.19042.844(see winver) / macOS Monterey 12 / Ubuntu 20.04.2 LTS -->
|
||||
- Download channels: <!-- Microsoft Store / Official Website / Github / AppStore / xx netdisk -->
|
||||
- Program version: <!-- 2.8.4 -->
|
||||
- Does it contain a standalone runtime: <!-- with_runtime or without fde in the file name -->
|
||||
@@ -1,20 +1,37 @@
|
||||
---
|
||||
name: question 🧐
|
||||
about: 对程序使用的疑问或需要帮助 / Questions about the use of the program or need help
|
||||
title: "🧐[Question] "
|
||||
labels: question
|
||||
name: "(Simplified Chinese)Question \U0001F9D0"
|
||||
about: 对程序使用的疑问或需要帮助
|
||||
title: "\U0001F9D0[Question] 请输入标题"
|
||||
labels: question
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
### 🧐 问题描述(Description)
|
||||
## 请认真检查以下清单中的每一项
|
||||
- [ ] 已经搜索过,没有发现类似的 issue
|
||||
- [ ] 已经搜索过文档,没有发现相关内容
|
||||
- [ ] 已经尝试使用过最新版,问题依旧存在
|
||||
- [ ] 使用的是官方版本(未替换及修改过安装目录程序文件)
|
||||
|
||||
<!--
|
||||
详细地描述需求,让大家都能理解
|
||||
发布前请先尝试在 Issuse 内搜索一下你的 Question 是否已经被提出过,
|
||||
别忘了填写标题,标题要简短的描述 Question
|
||||
-->
|
||||
|
||||
### 🚑 其他信息(Other Information)
|
||||
### 🧐 问题描述
|
||||
|
||||
<!--
|
||||
详细地描述 Question,让大家都能理解
|
||||
-->
|
||||
|
||||
### 🚑 其他信息
|
||||
|
||||
<!--
|
||||
如截图等其他信息可以贴在这里
|
||||
-->
|
||||
-->
|
||||
|
||||
- 处理器体系结构:<!-- x64 / x86 / arm64 -->
|
||||
- 系统版本号:<!-- example Windows 10.19042.844(see winver) / macOS Monterey 12 / Ubuntu 20.04.2 LTS -->
|
||||
- 下载渠道:<!-- 微软商店 / 官网 / Github / AppStore / xx网盘 -->
|
||||
- 程序版本:<!-- 2.8.4 -->
|
||||
- 是否包含独立运行时:<!-- 文件名中带有 with_runtime 或 不包含 fde -->
|
||||
|
||||
@@ -0,0 +1,126 @@
|
||||
name: CI
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
tags:
|
||||
- "*"
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
test:
|
||||
name: Test
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ windows-latest ]
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v2
|
||||
with:
|
||||
dotnet-version: 7.0.x
|
||||
|
||||
- name: Install Android SDK
|
||||
run: dotnet workload install android
|
||||
|
||||
- name: Install iOS SDK
|
||||
run: dotnet workload install ios
|
||||
|
||||
- name: Install macOS SDK
|
||||
run: dotnet workload install macos
|
||||
|
||||
- name: Install Mac Catalyst SDK
|
||||
run: dotnet workload install maccatalyst
|
||||
|
||||
- name: Install Maui
|
||||
run: dotnet workload install maui
|
||||
|
||||
# - name: Install wasm-tools
|
||||
# run: dotnet workload install wasm-tools
|
||||
|
||||
- name: Restore Workload
|
||||
run: dotnet workload restore
|
||||
|
||||
- name: Verify dotnet info
|
||||
run: dotnet --info
|
||||
|
||||
# - name: Test
|
||||
# shell: pwsh
|
||||
# run: dotnet test src/BD.Common.UnitTest/BD.Common.UnitTest.csproj -c Release -p:GeneratePackageOnBuild=false
|
||||
|
||||
build:
|
||||
name: Build
|
||||
needs: [ test ]
|
||||
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
|
||||
runs-on: windows-latest
|
||||
strategy:
|
||||
matrix:
|
||||
ProjectName: [
|
||||
BD.WTTS.Client.Avalonia.App,
|
||||
]
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup .NET
|
||||
uses: actions/setup-dotnet@v2
|
||||
with:
|
||||
dotnet-version: 7.0.x
|
||||
|
||||
- name: Install Android SDK
|
||||
run: dotnet workload install android
|
||||
|
||||
- name: Install iOS SDK
|
||||
run: dotnet workload install ios
|
||||
|
||||
- name: Install macOS SDK
|
||||
run: dotnet workload install macos
|
||||
|
||||
- name: Install Mac Catalyst SDK
|
||||
run: dotnet workload install maccatalyst
|
||||
|
||||
- name: Install Maui
|
||||
run: dotnet workload install maui
|
||||
|
||||
# - name: Install wasm-tools
|
||||
# run: dotnet workload install wasm-tools
|
||||
|
||||
- name: Restore Workload
|
||||
run: dotnet workload restore
|
||||
|
||||
- name: Verify dotnet info
|
||||
run: dotnet --info
|
||||
|
||||
- name: Build
|
||||
shell: pwsh
|
||||
run: dotnet build -c Release src\${{ matrix.ProjectName }}\${{ matrix.ProjectName }}.csproj
|
||||
|
||||
# release:
|
||||
# name: Release
|
||||
# needs: build
|
||||
# runs-on: ubuntu-latest
|
||||
#
|
||||
# steps:
|
||||
# - name: Changelog
|
||||
# uses: glennawatson/ChangeLog@v1
|
||||
# id: changelog
|
||||
#
|
||||
# - name: Create Release
|
||||
# uses: ncipollo/release-action@v1
|
||||
# with:
|
||||
# token: ${{ secrets.RMBADMIN_TOKEN }}
|
||||
# body: ${{ steps.changelog.outputs.commitLog }}
|
||||
# draft: false
|
||||
# prerelease: false
|
||||
@@ -1,16 +0,0 @@
|
||||
|
||||
name: Sync To Gitee
|
||||
|
||||
on: [ push, delete, create ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Sync to Gitee
|
||||
uses: wearerequired/git-mirror-action@master
|
||||
env:
|
||||
SSH_PRIVATE_KEY: ${{ secrets.GITEE_PRIVATE_KEY }}
|
||||
with:
|
||||
source-repo: "git@github.com:SteamTools-Team/SteamTools.git"
|
||||
destination-repo: "git@gitee.com:rmbgame/SteamTools"
|
||||
@@ -1,61 +0,0 @@
|
||||
name: .NET
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master, develop ]
|
||||
pull_request:
|
||||
branches: [ master, develop ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ windows-latest, macOS-latest, ubuntu-latest ]
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Setup .NET 5
|
||||
uses: actions/setup-dotnet@v1
|
||||
with:
|
||||
dotnet-version: 5.0.x
|
||||
- name: Setup .NET 6
|
||||
uses: actions/setup-dotnet@v1
|
||||
with:
|
||||
dotnet-version: 6.0.100-preview.4.21255.9
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
- name: Checkout submodules
|
||||
run: git submodule update --init --recursive
|
||||
|
||||
- name: dotnet info
|
||||
run: dotnet --info
|
||||
|
||||
- name: dotnet restore SteamToolsV2+.sln
|
||||
if: matrix.os == 'windows-latest'
|
||||
run: dotnet restore ./SteamToolsV2+.sln
|
||||
|
||||
- name: dotnet restore SteamToolsV2+.Linux.sln
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
run: dotnet restore ./SteamToolsV2+.Linux.sln
|
||||
|
||||
- name: dotnet restore SteamToolsV2+.Mac.sln
|
||||
if: matrix.os == 'macOS-latest'
|
||||
run: dotnet restore ./SteamToolsV2+.Mac.sln
|
||||
|
||||
- name: dotnet AvaloniaApp build
|
||||
run: dotnet build ./src/ST.Client.Desktop.Avalonia.App/ST.Client.Desktop.Avalonia.App.csproj
|
||||
- name: dotnet CommonUnit build
|
||||
run: dotnet build ./tests/Common.UnitTest/Common.UnitTest.csproj
|
||||
- name: dotnet ST.Client.UnitTest build
|
||||
run: dotnet build ./tests/ST.Client.UnitTest/ST.Client.UnitTest.csproj
|
||||
- name: dotnet ST.Client.Desktop.UnitTest build
|
||||
run: dotnet build ./tests/ST.Client.Desktop.UnitTest/ST.Client.Desktop.UnitTest.csproj
|
||||
|
||||
- name: dotnet CommonUnit test
|
||||
run: dotnet test ./tests/Common.UnitTest/Common.UnitTest.csproj
|
||||
- name: dotnet ST.Client.UnitTest test
|
||||
run: dotnet test ./tests/ST.Client.UnitTest/ST.Client.UnitTest.csproj
|
||||
- name: dotnet ST.Client.Desktop.UnitTest test
|
||||
if: matrix.os != 'windows-latest'
|
||||
run: dotnet test ./tests/ST.Client.Desktop.UnitTest/ST.Client.Desktop.UnitTest.csproj
|
||||
@@ -13,6 +13,9 @@
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Mono auto generated files
|
||||
mono_crash.*
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
@@ -26,7 +29,7 @@ bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Ll]og/
|
||||
[Ll]ib/
|
||||
[Ll]ogs/
|
||||
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
@@ -40,9 +43,10 @@ Generated\ Files/
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUNIT
|
||||
# NUnit
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
nunit-*.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
@@ -123,9 +127,6 @@ _ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# JustCode is a .NET coding add-in
|
||||
.JustCode
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
@@ -182,7 +183,9 @@ publish/
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# *.nupkg
|
||||
# NuGet Symbol Packages
|
||||
# *.snupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
@@ -207,6 +210,8 @@ BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
*.appx
|
||||
*.appxbundle
|
||||
*.appxupload
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
@@ -256,7 +261,9 @@ ServiceFabricBackup/
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
*.rptproj.rsuser
|
||||
*- Backup*.rdl
|
||||
*- [Bb]ackup.rdl
|
||||
*- [Bb]ackup ([0-9]).rdl
|
||||
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
@@ -292,10 +299,6 @@ paket-files/
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# JetBrains Rider
|
||||
.idea/
|
||||
*.sln.iml
|
||||
|
||||
# CodeRush personal settings
|
||||
.cr/personal
|
||||
|
||||
@@ -346,18 +349,235 @@ MigrationBackup/
|
||||
# Ionide (cross platform F# VS Code tools) working folder
|
||||
.ionide/
|
||||
|
||||
# Built application files
|
||||
*.apk
|
||||
*.aar
|
||||
*.ap_
|
||||
*.aab
|
||||
|
||||
# Files for the ART/Dalvik VM
|
||||
*.dex
|
||||
|
||||
# Java class files
|
||||
*.class
|
||||
|
||||
# Log file
|
||||
*.log
|
||||
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.nar
|
||||
*.ear
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
|
||||
# Generated files
|
||||
bin/
|
||||
gen/
|
||||
out/
|
||||
# Uncomment the following line in case you need and you don't have the release build type files in your app
|
||||
# release/
|
||||
|
||||
# Gradle files
|
||||
.gradle/
|
||||
build/
|
||||
|
||||
# Local configuration file (sdk path, etc)
|
||||
local.properties
|
||||
|
||||
# Proguard folder generated by Eclipse
|
||||
proguard/
|
||||
|
||||
# Log Files
|
||||
*.log
|
||||
|
||||
# Android Studio Navigation editor temp files
|
||||
.navigation/
|
||||
|
||||
# Android Studio captures folder
|
||||
captures/
|
||||
|
||||
# IntelliJ
|
||||
*.iml
|
||||
.idea/workspace.xml
|
||||
.idea/tasks.xml
|
||||
.idea/gradle.xml
|
||||
.idea/assetWizardSettings.xml
|
||||
.idea/dictionaries
|
||||
.idea/libraries
|
||||
# Android Studio 3 in .gitignore file.
|
||||
.idea/caches
|
||||
.idea/modules.xml
|
||||
# Comment next line if keeping position of elements in Navigation Editor is relevant for you
|
||||
.idea/navEditor.xml
|
||||
|
||||
# Keystore files
|
||||
# Uncomment the following lines if you do not want to check your keystore files in.
|
||||
#*.jks
|
||||
#*.keystore
|
||||
|
||||
# External native build folder generated in Android Studio 2.2 and later
|
||||
.externalNativeBuild
|
||||
.cxx/
|
||||
|
||||
# Google Services (e.g. APIs or Firebase)
|
||||
# google-services.json
|
||||
|
||||
# Freeline
|
||||
freeline.py
|
||||
freeline/
|
||||
freeline_project_description.json
|
||||
|
||||
# fastlane
|
||||
fastlane/report.xml
|
||||
fastlane/Preview.html
|
||||
fastlane/screenshots
|
||||
fastlane/test_output
|
||||
fastlane/readme.md
|
||||
|
||||
# Version control
|
||||
vcs.xml
|
||||
|
||||
# lint
|
||||
lint/intermediates/
|
||||
lint/generated/
|
||||
lint/outputs/
|
||||
lint/tmp/
|
||||
# lint/reports/
|
||||
|
||||
# Xcode
|
||||
#
|
||||
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
|
||||
|
||||
## User settings
|
||||
xcuserdata/
|
||||
|
||||
## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
|
||||
*.xcscmblueprint
|
||||
*.xccheckout
|
||||
|
||||
## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
|
||||
build/
|
||||
DerivedData/
|
||||
*.moved-aside
|
||||
*.pbxuser
|
||||
!default.pbxuser
|
||||
*.mode1v3
|
||||
!default.mode1v3
|
||||
*.mode2v3
|
||||
!default.mode2v3
|
||||
*.perspectivev3
|
||||
!default.perspectivev3
|
||||
|
||||
## Obj-C/Swift specific
|
||||
*.hmap
|
||||
|
||||
## App packaging
|
||||
*.ipa
|
||||
*.dSYM.zip
|
||||
*.dSYM
|
||||
|
||||
## Playgrounds
|
||||
timeline.xctimeline
|
||||
playground.xcworkspace
|
||||
|
||||
# Swift Package Manager
|
||||
#
|
||||
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
|
||||
# Packages/
|
||||
# Package.pins
|
||||
# Package.resolved
|
||||
# *.xcodeproj
|
||||
#
|
||||
# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
|
||||
# hence it is not needed unless you have added a package configuration file to your project
|
||||
# .swiftpm
|
||||
|
||||
.build/
|
||||
|
||||
# CocoaPods
|
||||
#
|
||||
# We recommend against adding the Pods directory to your .gitignore. However
|
||||
# you should judge for yourself, the pros and cons are mentioned at:
|
||||
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
|
||||
#
|
||||
# Pods/
|
||||
#
|
||||
# Add this line if you want to avoid checking in source code from the Xcode workspace
|
||||
# *.xcworkspace
|
||||
|
||||
# Carthage
|
||||
#
|
||||
# Add this line if you want to avoid checking in source code from Carthage dependencies.
|
||||
# Carthage/Checkouts
|
||||
|
||||
Carthage/Build/
|
||||
|
||||
# Accio dependency management
|
||||
Dependencies/
|
||||
.accio/
|
||||
|
||||
# fastlane
|
||||
#
|
||||
# It is recommended to not store the screenshots in the git repo.
|
||||
# Instead, use fastlane to re-generate the screenshots whenever they are needed.
|
||||
# For more information about the recommended setup visit:
|
||||
# https://docs.fastlane.tools/best-practices/source-control/#source-control
|
||||
|
||||
fastlane/report.xml
|
||||
fastlane/Preview.html
|
||||
fastlane/screenshots/**/*.png
|
||||
fastlane/test_output
|
||||
|
||||
# Code Injection
|
||||
#
|
||||
# After new code Injection tools there's a generated folder /iOSInjectionProject
|
||||
# https://github.com/johnno1962/injectionforxcode
|
||||
|
||||
iOSInjectionProject/
|
||||
|
||||
# Prerequisites
|
||||
*.d
|
||||
|
||||
# Compiled Object files
|
||||
*.slo
|
||||
*.lo
|
||||
*.o
|
||||
*.obj
|
||||
|
||||
# Precompiled Headers
|
||||
*.gch
|
||||
*.pch
|
||||
|
||||
# Fortran module files
|
||||
*.mod
|
||||
*.smod
|
||||
|
||||
# Compiled Static libraries
|
||||
*.lai
|
||||
*.la
|
||||
*.a
|
||||
*.lib
|
||||
|
||||
# Executables
|
||||
*.out
|
||||
*.app
|
||||
|
||||
# macOS
|
||||
.DS_Store
|
||||
|
||||
# Design Resource
|
||||
*.psd
|
||||
|
||||
# Android Resource Designer
|
||||
Resource.designer.cs
|
||||
|
||||
# csproject launchSettings
|
||||
launchSettings.json
|
||||
|
||||
# Android KeyStore
|
||||
*.jks
|
||||
/Xamarin.Android.KeyStore.props
|
||||
# WTTS
|
||||
.idea
|
||||
/pkg
|
||||
!**/BD.WTTS.Client.Avalonia.App
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
[submodule "references/Titanium-Web-Proxy"]
|
||||
path = references/Titanium-Web-Proxy
|
||||
url = https://github.com/SteamTools-Team/Titanium-Web-Proxy.git
|
||||
[submodule "references/MetroRadiance"]
|
||||
path = references/MetroRadiance
|
||||
url = https://github.com/rmbadmin/MetroRadiance.git
|
||||
[submodule "references/SteamAchievementManager"]
|
||||
path = references/SteamAchievementManager
|
||||
url = https://github.com/SteamTools-Team/SteamAchievementManager.git
|
||||
[submodule "references/Steam4NET"]
|
||||
path = references/Steam4NET
|
||||
url = https://github.com/SteamTools-Team/Steam4NET.git
|
||||
[submodule "references/Depressurizer"]
|
||||
path = references/Depressurizer
|
||||
url = https://github.com/SteamTools-Team/Depressurizer.git
|
||||
[submodule "references/AvaloniaGif"]
|
||||
path = references/AvaloniaGif
|
||||
url = https://github.com/SteamTools-Team/AvaloniaGif
|
||||
[submodule "references/WinAuth"]
|
||||
path = references/WinAuth
|
||||
url = https://github.com/SteamTools-Team/WinAuth
|
||||
[submodule "ref/DirectoryPackages"]
|
||||
path = ref/DirectoryPackages
|
||||
url = https://github.com/BeyondDimension/DirectoryPackages.git
|
||||
[submodule "ref/ArchiSteamFarm"]
|
||||
path = ref/ArchiSteamFarm
|
||||
url = https://github.com/BeyondDimension/ArchiSteamFarm.git
|
||||
[submodule "ref/Avalonia.Image2"]
|
||||
path = ref/Avalonia.Image2
|
||||
url = https://github.com/BeyondDimension/Avalonia.Image2.git
|
||||
[submodule "ref/Gameloop.Vdf"]
|
||||
path = ref/Gameloop.Vdf
|
||||
url = https://github.com/BeyondDimension/Gameloop.Vdf.git
|
||||
[submodule "ref/Steam4NET"]
|
||||
path = ref/Steam4NET
|
||||
url = https://github.com/BeyondDimension/Steam4NET.git
|
||||
[submodule "ref/Titanium-Web-Proxy"]
|
||||
path = ref/Titanium-Web-Proxy
|
||||
url = https://github.com/BeyondDimension/Titanium-Web-Proxy.git
|
||||
[submodule "ref/SteamAchievementManager"]
|
||||
path = ref/SteamAchievementManager
|
||||
url = https://github.com/BeyondDimension/SteamAchievementManager.git
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<LangVersion>9.0</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
||||
<TrimMode>link</TrimMode>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" Exists('$(MSBuildProjectDirectory)\..\..\Unicorn.pfx') ">
|
||||
<DefineConstants>SIGN_ASSEMBLY;$(DefineConstants)</DefineConstants>
|
||||
<SignAssembly>true</SignAssembly>
|
||||
<DelaySign>false</DelaySign>
|
||||
<AssemblyOriginatorKeyFile>..\..\Unicorn.pfx</AssemblyOriginatorKeyFile>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)'=='Release' ">
|
||||
<DebugType>none</DebugType>
|
||||
<DebugSymbols>false</DebugSymbols>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,7 @@
|
||||
<configuration>
|
||||
<packageSources>
|
||||
<add key="LocalNuGetPackages_rx" value="./ref/pkg/rx" />
|
||||
<add key="LocalNuGetPackages_wtts" value="./ref/pkg/wtts" />
|
||||
<add key="avalonia-nightly" value="https://pkgs.dev.azure.com/AvaloniaUI/AvaloniaUI/_packaging/avalonia-all/nuget/v3/index.json" protocolVersion="3" />
|
||||
</packageSources>
|
||||
</configuration>
|
||||
@@ -1,114 +1,90 @@
|
||||
<h1 align="center">Steam++ Tools 🧰</h1>
|
||||
<h1 align="center">Watt Toolkit 🧰 (Former name Steam++)</h1>
|
||||
|
||||
<div align="center">
|
||||
|
||||
「Steam++」is a toolkit that contains a variety of Steam tools, most of which require you to download and install Steam in order to use them.
|
||||
|
||||

|
||||
[](https://github.com/rmbadmin/SteamTools/releases/latest)
|
||||
[](LICENSE)
|
||||
[](https://github.com/rmbadmin/SteamTools/stargazers)
|
||||
[](https://github.com/rmbadmin/SteamTools/network/members)
|
||||

|
||||
[](https://github.com/SteamTools-Team/SteamTools/search?l=c%23)
|
||||
[](https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-4)
|
||||
[](https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9)
|
||||
|
||||
[](https://github.com/AvaloniaUI/Avalonia)
|
||||
[](https://github.com/xamarin/Xamarin.Forms)
|
||||
[](https://github.com/ant-design/ant-design)
|
||||
[](https://github.com/ant-design-blazor/ant-design-blazor)
|
||||
|
||||
[](https://actions-badge.atrox.dev/SteamTools-Team/SteamTools/goto?ref=develop)
|
||||
[](https://github.com/SteamTools-Team/SteamTools)
|
||||
[](https://gitee.com/rmbgame/SteamTools)
|
||||
</div>
|
||||
|
||||
<div align="center"><img src="./resources/screenshots.en.jpg" /></div>
|
||||
|
||||
English | [简体中文](./README.md)
|
||||
|
||||
"Watt Toolkit" is an open source cross-platform multi-purpose game toolkit, most of its features require you to download and install Steam to use it.
|
||||
|
||||

|
||||
[](https://github.com/BeyondDimension/SteamTools/releases/latest)
|
||||
[](LICENSE)
|
||||
[](https://github.com/BeyondDimension/SteamTools/stargazers)
|
||||
[](https://github.com/BeyondDimension/SteamTools/network/members)
|
||||

|
||||
[](https://github.com/BeyondDimension/SteamTools/search?l=c%23)
|
||||
[](https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-7)
|
||||
[](https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-11)
|
||||
|
||||
[](https://ko-fi.com/rmbgame)
|
||||
[](https://www.patreon.com/rmbgame)
|
||||
|
||||
[](https://actions-badge.atrox.dev/BeyondDimension/SteamTools/goto?ref=develop)
|
||||
[](https://github.com/BeyondDimension/SteamTools)
|
||||
[](https://gitee.com/rmbgame/SteamTools)
|
||||
[](https://space.bilibili.com/797215)
|
||||
|
||||
</div>
|
||||
|
||||
## 🚀 Download Channels
|
||||
- [](https://apps.microsoft.com/store/detail/watt-toolkit/9MTCFHS560NG)
|
||||
- [Official WebSite](https://steampp.net)
|
||||
- [GitHub Releases](https://github.com/BeyondDimension/SteamTools/releases)
|
||||
- [Gitee Releases](https://gitee.com/rmbgame/SteamTools/releases)
|
||||
- [Arch User Repository](https://aur.archlinux.org/packages/watt-toolkit-bin)(Current release build)
|
||||
- [Arch User Repository dev](https://aur.archlinux.org/packages/watt-toolkit-git)(Pull the latest source code build, maybe the build will fail)
|
||||
|
||||
## ⬇️ [Download Guide](./doc/download-guide.en.md)
|
||||
See details [./doc/download-guide.en.md](./doc/download-guide.en.md)
|
||||
|
||||
## ✨ Functions
|
||||
1. Local reverse proxy for Steam's community webpage to enable normal access in **the Chinese Mainland, Mainland of China**
|
||||
2. Quickly switch the Steam account that the current PC has remembered to log into
|
||||
- This feature is to read the local user login records stored under the Steam path to directly display the operation, you can switch between multiple accounts without re-entering passwords and tokens.
|
||||
3. Achievement stat modifications for Steam games
|
||||
- Function reference SteamAchievementManager for secondary development, modified the game list loading and operation ease of use.
|
||||
4. Steam Local Two-Step Authenticator
|
||||
- The function reference [WinAuth](https://github.com/winauth/winauth) is developed to enable you to view your token without launching the mobile version of Steam App, similar function software are [WinAuth](https://github.com/winauth/winauth), [SteamDesktopAuthenticator](https://github.com/Jessecar96/SteamDesktopAuthenticator).
|
||||
5. Some game tools
|
||||
- Currently there is a forced game borderless windowing, CSGO fix mistake VAC shield.
|
||||
1. Account Switch <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" />
|
||||
- Switch between Steam accounts that are already logged in on the current PC with one click, and manage features such as sorting your home shared library.
|
||||
2. Inventory Management <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" />
|
||||
- Lets you manage your Steam game inventory directly, not only by downloading older Steam games, but also by managing Steam game achievements directly, supporting unlocked achievements and unlocked achievements.
|
||||
3. Local Authentication <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" /> <img src="./res/brands/android.svg" width="16" height="16" />
|
||||
- Let your cell phone token unified save in the computer, currently only support Steam token, later will develop support more token types with cloud synchronization token.
|
||||
4. ArchiSteamFarm <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" /> <img src="./res/brands/android.svg" width="16" height="16" />
|
||||
- Integration with [ArchiSteamFarm](https://github.com/JustArchiNET/ArchiSteamFarm) provides functions such as hanging and dropping Steam Collectible Cards within the app.
|
||||
5. Game Tools <img src="./res/brands/windows.svg" width="16" height="16" />
|
||||
- Force game windows to use borderless windowing
|
||||
|
||||
<!--Prerequisites Microsoft Visual C++ 2015-2019 Redistributable [64 bit](https://aka.ms/vs/16/release/vc_redist.x64.exe) / [32 bit](https://aka.ms/vs/16/release/vc_redist.x86.exe)-->
|
||||
## 🖥 Supported Operating Systems
|
||||
- Desktop(Only 64 bit is supported)
|
||||
- Windows 10 1607+ / Windows Server, version 1909+ / Windows Server 2019 / Windows Server 2016
|
||||
- Windows 8.1 / Windows Server 2012 R2
|
||||
- Windows 7 SP1 [ESU](https://docs.microsoft.com/troubleshoot/windows-client/windows-7-eos-faq/windows-7-extended-security-updates-faq)
|
||||
- Prerequisites
|
||||
- KB3063858 [64 bit](https://www.microsoft.com/download/details.aspx?id=47442) / [32 bit](https://www.microsoft.com/download/details.aspx?id=47409)
|
||||
- macOS 10.13 High Sierra Or Higher
|
||||
- Linux Distribution
|
||||
- Arch Linux
|
||||
- Alpine Linux 3.11+
|
||||
- CentOS 7+
|
||||
- Debian 9+
|
||||
- Deepin 20.1 / UOS 20
|
||||
- Fedora 32+
|
||||
- Linux Mint 18+
|
||||
- openSUSE 15+
|
||||
- Red Hat Enterprise Linux 7+
|
||||
- SUSE Enterprise Linux (SLES) 12 SP2+
|
||||
- Ubuntu 20.10, 20.04, 18.04, 16.04
|
||||
- Mobile(Only ARM64 or ARM32 are supported)
|
||||
- Android 5.0+
|
||||
- iOS 10.0+
|
||||
- Windows 11
|
||||
- Windows 10 version 1809(OS internal version 17763) or higher is required
|
||||
- macOS 10.15 or higher is required
|
||||
- Ubuntu 18.04 or higher is required
|
||||
- Debian 10 or higher is required
|
||||
- CentOS 7 or higher is required
|
||||
- Deepin(UOS) 20 or higher is required
|
||||
- ~~iOS 11 or higher is required~~(In development…)
|
||||
- Android 5.0(API 21) or higher is required
|
||||
|
||||
## ⛔ Unsupported Operating System
|
||||
- Windows 8
|
||||
- [Due to Microsoft's official support for the product has ended](https://docs.microsoft.com/lifecycle/products/windows-8), so this program cannot run on this operating system, [It is recommended to upgrade to Windows 8.1](https://support.microsoft.com/windows/update-to-windows-8-1-from-windows-8-17fc54a7-a465-6b5a-c1a0-34140afd0669)
|
||||
- Windows Server 2012 / 2008 R2 SP1
|
||||
- Only version 1.X is available, and version 2.X is not supported. It is recommended to upgrade to **Windows Server 2012 R2** or higher
|
||||
- Windows Server / Linux version without desktop GUI
|
||||
## 🧩 Screenshots
|
||||
<img src="./res/screenshots/screenshot-windows-accelerator.webp" width="800" />
|
||||
<br/>
|
||||
<br/>
|
||||
<img src="./res/screenshots/screenshot-android-authenticator.png" width="800" />
|
||||
|
||||
## 🌏 Roadmap
|
||||
Read what we [milestones](https://github.com/SteamTools-Team/SteamTools/milestones), and feel free to ask questions.
|
||||
Read what we [milestones](https://github.com/BeyondDimension/SteamTools/milestones), and feel free to ask questions.
|
||||
|
||||
## ⌨️ Development Environment
|
||||
[Visual Studio 2019 Version 16.10 Or Higher](https://visualstudio.microsoft.com/vs/) Or [JetBrains Rider](https://www.jetbrains.com/rider/) Or ~~[Visual Studio for Mac](https://visualstudio.microsoft.com/vs/mac/)~~ Or ~~[Visual Studio Code](https://code.visualstudio.com/)~~
|
||||
- Supported Operating Systems
|
||||
- [Windows 10 version 2004 or higher: Home, Professional, Education, and Enterprise (LTSC and S are not supported)](https://docs.microsoft.com/en-us/visualstudio/releases/2019/system-requirements)
|
||||
- [macOS 10.13 High Sierra Or Higher](https://docs.microsoft.com/en-us/visualstudio/productinfo/vs2019-system-requirements-mac)
|
||||
- Workload
|
||||
- Web and Cloud
|
||||
- ASP.NET and Web Development
|
||||
- Desktop and Mobile Applications
|
||||
- .NET Desktop Development
|
||||
- UWP Development
|
||||
- Mobile Development using .Net
|
||||
- Other Toolsets
|
||||
- .NET Core Cross Platform Development
|
||||
- Single Component
|
||||
- GitHub Extension for Visual Studio
|
||||
- Windows 10 SDK (10.0.19041.0)
|
||||
- [Visual Studio Marketplace](https://marketplace.visualstudio.com/)
|
||||
- [Avalonia for Visual Studio](https://marketplace.visualstudio.com/items?itemName=AvaloniaTeam.AvaloniaforVisualStudio)
|
||||
- [NUnit VS Templates](https://marketplace.visualstudio.com/items?itemName=NUnitDevelopers.NUnitTemplatesforVisualStudio)
|
||||
[Visual Studio 2022](https://visualstudio.microsoft.com/vs)
|
||||
[Visual Studio 2022 for Mac](https://visualstudio.microsoft.com/vs/mac)
|
||||
[JetBrains Rider](https://www.jetbrains.com/rider)
|
||||
[Visual Studio Code](https://code.visualstudio.com)
|
||||
[OpenJDK 17](https://learn.microsoft.com/en-us/java/openjdk/download#openjdk-17)
|
||||
[Android Studio Electric Eel Or Higher](https://developer.android.com/studio)
|
||||
[Xcode 14 Or Higher](https://developer.apple.com/xcode)
|
||||
|
||||
## 📄 Thanks to the following Open Source Projects
|
||||
* [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json)
|
||||
* [MetroRadiance](https://github.com/Grabacr07/MetroRadiance)
|
||||
* [MetroTrilithon](https://github.com/Grabacr07/MetroTrilithon)
|
||||
* [Livet](https://github.com/runceel/Livet)
|
||||
* [StatefulModel](https://github.com/ugaya40/StatefulModel)
|
||||
* [Hardcodet.NotifyIcon](https://github.com/HavenDV/Hardcodet.NotifyIcon.Wpf.NetCore)
|
||||
* [System.Reactive](https://github.com/dotnet/reactive)
|
||||
* [Titanium-Web-Proxy](https://github.com/justcoding121/Titanium-Web-Proxy)
|
||||
* [BrotliSharpLib](https://github.com/master131/BrotliSharpLib)
|
||||
* [YARP](https://github.com/microsoft/reverse-proxy)
|
||||
* [FastGithub](https://github.com/dotnetcore/FastGithub)
|
||||
* [Portable.BouncyCastle](https://github.com/novotnyllc/bc-csharp)
|
||||
* [Ninject](https://github.com/ninject/Ninject)
|
||||
* [log4net](https://github.com/apache/logging-log4net)
|
||||
* [SteamDB-API](https://github.com/SteamDB-API/api)
|
||||
* [SteamAchievementManager](https://github.com/gibbed/SteamAchievementManager)
|
||||
* [ArchiSteamFarm](https://github.com/JustArchiNET/ArchiSteamFarm)
|
||||
* [Steam4NET](https://github.com/SteamRE/Steam4NET)
|
||||
@@ -116,16 +92,20 @@ Read what we [milestones](https://github.com/SteamTools-Team/SteamTools/mileston
|
||||
* [SteamDesktopAuthenticator](https://github.com/Jessecar96/SteamDesktopAuthenticator)
|
||||
* [Gameloop.Vdf](https://github.com/shravan2x/Gameloop.Vdf)
|
||||
* [DnsClient.NET](https://github.com/MichaCo/DnsClient.NET)
|
||||
* [Costura.Fody](https://github.com/Fody/Costura)
|
||||
* [MessagePack-CSharp](https://github.com/neuecc/MessagePack-CSharp)
|
||||
* [MemoryPack](https://github.com/Cysharp/MemoryPack)
|
||||
* [CSharpVitamins.ShortGuid](https://github.com/AigioL/CSharpVitamins.ShortGuid)
|
||||
* [Nito.Comparers](https://github.com/StephenCleary/Comparers)
|
||||
* [Nito.Disposables](https://github.com/StephenCleary/Disposables)
|
||||
* [Crc32.NET](https://github.com/force-net/Crc32.NET)
|
||||
* [gfoidl.Base64](https://github.com/gfoidl/Base64)
|
||||
* [sqlite-net-pcl](https://github.com/praeclarum/sqlite-net)
|
||||
* [AutoMapper](https://github.com/AutoMapper/AutoMapper)
|
||||
* [Polly](https://github.com/App-vNext/Polly)
|
||||
* [TaskScheduler](https://github.com/dahall/taskscheduler)
|
||||
* [SharpZipLib](https://github.com/icsharpcode/SharpZipLib)
|
||||
* [LibVLCSharp](https://github.com/videolan/libvlcsharp)
|
||||
* [SevenZipSharp](https://github.com/squid-box/SevenZipSharp)
|
||||
* [ZstdNet](https://github.com/skbkontur/ZstdNet)
|
||||
* [Depressurizer](https://github.com/Depressurizer/Depressurizer)
|
||||
* [NLog](https://github.com/nlog/NLog)
|
||||
* [NUnit](https://github.com/nunit/nunit)
|
||||
@@ -134,28 +114,38 @@ Read what we [milestones](https://github.com/SteamTools-Team/SteamTools/mileston
|
||||
* [AvaloniaUI](https://github.com/AvaloniaUI/Avalonia)
|
||||
* [AvaloniaGif](https://github.com/jmacato/AvaloniaGif)
|
||||
* [Avalonia XAML Behaviors](https://github.com/wieslawsoltes/AvaloniaBehaviors)
|
||||
* [FluentAvalonia](https://github.com/amwx/FluentAvalonia)
|
||||
* [APNG.NET](https://github.com/jz5/APNG.NET)
|
||||
* [Chromium Embedded Framework (CEF)](https://github.com/chromiumembedded/cef)
|
||||
* [Moq](https://github.com/moq/moq4)
|
||||
* [NPOI](https://github.com/nissl-lab/npoi)
|
||||
* [Fleck](https://github.com/statianzo/Fleck)
|
||||
* [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore)
|
||||
* [AspNet.Security.OpenId.Providers](https://github.com/aspnet-contrib/AspNet.Security.OpenId.Providers)
|
||||
* [AspNet.Security.OAuth.Providers](https://github.com/aspnet-contrib/AspNet.Security.OAuth.Providers)
|
||||
* [CefNet](https://github.com/CefNet/CefNet)
|
||||
* [CefSharp](https://github.com/cefsharp/CefSharp)
|
||||
* [ZXing.Net](https://github.com/micjahn/ZXing.Net)
|
||||
* [QRCoder](https://github.com/codebude/QRCoder)
|
||||
* [QR Code Generator for .NET](https://github.com/manuelbl/QrCodeGenerator)
|
||||
* [TinyPinyin](https://github.com/promeG/TinyPinyin)
|
||||
* [TinyPinyin.Net](https://github.com/hueifeng/TinyPinyin.Net)
|
||||
* [Packaging utilities for .NET Core](https://github.com/qmfrederik/dotnet-packaging)
|
||||
* [React](https://github.com/facebook/react)
|
||||
* [Ant Design](https://github.com/ant-design/ant-design)
|
||||
* [Ant Design Blazor](https://github.com/ant-design-blazor/ant-design-blazor)
|
||||
* [Toast messages for Xamarin.iOS](https://github.com/andrius-k/Toast)
|
||||
* [XF.Material Library](https://github.com/Baseflow/XF-Material-Library)
|
||||
* [ImageCirclePlugin](https://github.com/jamesmontemagno/ImageCirclePlugin)
|
||||
* [Visual Studio App Center SDK for .NET](https://github.com/microsoft/appcenter-sdk-dotnet)
|
||||
* [AppCenter-XMac](https://github.com/nor0x/AppCenter-XMac)
|
||||
* [MSBuild.Sdk.Extras](https://github.com/novotnyllc/MSBuildSdkExtras)
|
||||
* [Xamarin.Essentials](https://github.com/xamarin/essentials)
|
||||
* [Xamarin.Forms](https://github.com/xamarin/Xamarin.Forms)
|
||||
* [Open Source Components for Xamarin](https://github.com/xamarin/XamarinComponents)
|
||||
* [Google Play Services / Firebase / ML Kit for Xamarin.Android](https://github.com/xamarin/GooglePlayServicesComponents)
|
||||
* [Picasso](https://github.com/square/picasso)
|
||||
* [OkHttp](https://github.com/square/okhttp)
|
||||
* [Material Components for Android](https://github.com/material-components/material-components-android)
|
||||
* [AndroidX for Xamarin.Android](https://github.com/xamarin/AndroidX)
|
||||
* [MSAL.NET](https://github.com/AzureAD/microsoft-authentication-library-for-dotnet)
|
||||
* [Android Jetpack](https://github.com/androidx/androidx)
|
||||
* [ConstraintLayout](https://github.com/androidx/constraintlayout)
|
||||
* [Entity Framework Core](https://github.com/dotnet/efcore)
|
||||
* [ASP.NET Core](https://github.com/dotnet/aspnetcore)
|
||||
* [Windows Forms](https://github.com/dotnet/winforms)
|
||||
|
||||
@@ -1,126 +1,134 @@
|
||||
<h1 align="center">Steam++ 工具箱 🧰</h1>
|
||||
<h1 align="center">Watt Toolkit 🧰 (原名 Steam++)</h1>
|
||||
|
||||
<div align="center">
|
||||
|
||||
「Steam++」是一个包含多种Steam工具功能的工具箱,此工具的大部分功能都是需要您下载安装Steam才能使用。
|
||||
|
||||

|
||||
[](https://github.com/rmbadmin/SteamTools/releases/latest)
|
||||
[](LICENSE)
|
||||
[](https://github.com/rmbadmin/SteamTools/stargazers)
|
||||
[](https://github.com/rmbadmin/SteamTools/network/members)
|
||||

|
||||
[](https://github.com/SteamTools-Team/SteamTools/search?l=c%23)
|
||||
[](https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-4)
|
||||
[](https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-9)
|
||||
|
||||
[](https://github.com/AvaloniaUI/Avalonia)
|
||||
[](https://github.com/xamarin/Xamarin.Forms)
|
||||
[](https://github.com/ant-design/ant-design)
|
||||
[](https://github.com/ant-design-blazor/ant-design-blazor)
|
||||
|
||||
[](https://actions-badge.atrox.dev/SteamTools-Team/SteamTools/goto?ref=develop)
|
||||
[](https://github.com/SteamTools-Team/SteamTools)
|
||||
[](https://gitee.com/rmbgame/SteamTools)
|
||||
[](https://qm.qq.com/cgi-bin/qm/qr?k=JVlZF31RKSDqcsxfEaw6AQE75P2NF18F&jump_from=webapi)
|
||||
</div>
|
||||
|
||||
<div align="center"><img src="./resources/screenshots.jpg" /></div>
|
||||
|
||||
[English](./README.en.md) | 简体中文
|
||||
|
||||
「Watt Toolkit」是一个开源跨平台的多功能游戏工具箱,此工具的大部分功能都是需要您下载安装 Steam 才能使用。
|
||||
|
||||

|
||||
[](https://github.com/BeyondDimension/SteamTools/releases/latest)
|
||||
[](LICENSE)
|
||||
[](https://github.com/BeyondDimension/SteamTools/stargazers)
|
||||
[](https://github.com/BeyondDimension/SteamTools/network/members)
|
||||

|
||||
[](https://github.com/BeyondDimension/SteamTools/search?l=c%23)
|
||||
[](https://learn.microsoft.com/zh-cn/dotnet/core/whats-new/dotnet-7)
|
||||
[](https://learn.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-11)
|
||||
|
||||
[](https://afdian.net/@rmbgame)
|
||||
[](https://ko-fi.com/rmbgame)
|
||||
[](https://www.patreon.com/rmbgame)
|
||||
|
||||
[](https://actions-badge.atrox.dev/BeyondDimension/SteamTools/goto?ref=develop)
|
||||
[](https://github.com/BeyondDimension/SteamTools)
|
||||
[](https://gitee.com/rmbgame/SteamTools)
|
||||
[](https://space.bilibili.com/797215)
|
||||
[](https://jq.qq.com/?_wv=1027&k=3JKPt4xC)
|
||||
|
||||
</div>
|
||||
|
||||
## 🚀 下载渠道
|
||||
- [](https://apps.microsoft.com/store/detail/watt-toolkit/9MTCFHS560NG?hl=zh-cn&gl=cn)
|
||||
- [软件官网](https://steampp.net)
|
||||
- [GitHub 发行版](https://github.com/BeyondDimension/SteamTools/releases)
|
||||
- [码云 发行版](https://gitee.com/rmbgame/SteamTools/releases)
|
||||
- [Arch 用户仓库](https://aur.archlinux.org/packages/watt-toolkit-bin)(当前 Release 构建)
|
||||
- [Arch 用户仓库 dev](https://aur.archlinux.org/packages/watt-toolkit-git)(拉取最新源码构建,也许会构建失败)
|
||||
|
||||
## ⬇️ [下载指南](./doc/download-guide.md)
|
||||
详见 [./doc/download-guide.md](./doc/download-guide.md)
|
||||
|
||||
## ✨ 功能
|
||||
1. 反代 Steam 的社区网页使其能正常访问
|
||||
- 功能类似羽翼城大佬的 [steamcommunity_302](https://www.dogfight360.com/blog/686/)
|
||||
- 使用 [Titanium-Web-Proxy](https://github.com/justcoding121/Titanium-Web-Proxy) 开源项目进行本地反代,使国内用户可以正常访问 Steam 社区页
|
||||
- 相比 **302工具** 具有更快的启动速度,以及支持简单的脚本注入(还顺便支持了Pixiv、Discord、Twitch等网站的反代支持)
|
||||
2. 快速切换当前设备已记住登陆的 Steam 账号
|
||||
- 该功能是读取 Steam 路径下存储的本地用户登录记录直接展示操作,可以多账号切换无需重新输入密码和令牌
|
||||
3. Steam游戏的成就统计管理功能
|
||||
- 功能参考 [SteamAchievementManager](https://github.com/gibbed/SteamAchievementManager) 进行二次开发,修改了游戏列表的加载和操作易用性
|
||||
4. Steam本地两步身份验证器
|
||||
- 功能参考 [WinAuth](https://github.com/winauth/winauth) 开发,可以使您不用启动移动版 Steam App 也能查看您的令牌
|
||||
- 本地令牌交易市场报价确认
|
||||
- 功能类似的软件例如:
|
||||
- [WinAuth](https://github.com/winauth/winauth)
|
||||
- [SteamDesktopAuthenticator](https://github.com/Jessecar96/SteamDesktopAuthenticator)
|
||||
5. 其他游戏工具
|
||||
- 目前已有强制游戏无边框窗口化,CSGO 修复 VAC 误屏蔽
|
||||
1. 网络加速 <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" /> <img src="./res/brands/android.svg" width="16" height="16" />
|
||||
- ~~使用 [Titanium-Web-Proxy](https://github.com/justcoding121/Titanium-Web-Proxy) 开源项目进行本地反代来支持更快的访问游戏网站。~~
|
||||
- 使用 [YARP.ReverseProxy](https://github.com/microsoft/reverse-proxy) 开源项目进行本地反代来支持更快的访问游戏网站。
|
||||
2. 脚本配置 <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" />
|
||||
- 通过加速服务拦截网络请求将一些 JS 脚本注入在网页中,提供类似网页插件的功能。
|
||||
3. 账号切换 <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" />
|
||||
- 一键切换已在当前 PC 上登录过的 Steam 账号,与管理家庭共享库排序及禁用等功能。
|
||||
4. 库存管理 <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" />
|
||||
- 让您直接管理 Steam 游戏库存,可以编辑游戏名称和[自定义封面](https://www.steamgriddb.com),也能解锁以及反解锁 Steam 游戏成就。
|
||||
- 监控 Steam 游戏下载进度实现 Steam 游戏下载完成定时关机功能。
|
||||
- 模拟运行 Steam 游戏,让您不用安装和下载对应的游戏也能挂游玩时间和 Steam 卡片
|
||||
- 自助管理 Steam 游戏云存档,随时删除和上传自定义的存档文件至 Steam 云
|
||||
5. 本地令牌 <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" /> <img src="./res/brands/android.svg" width="16" height="16" />
|
||||
- 让您的手机令牌统一保存在电脑中,目前仅支持 Steam 令牌,后续会开发支持更多的令牌种类与云同步令牌。
|
||||
6. 自动挂卡 <img src="./res/brands/windows.svg" width="16" height="16" /> <img src="./res/brands/linux.svg" width="16" height="16" /> <img src="./res/brands/apple.svg" width="16" height="16" /> <img src="./res/brands/android.svg" width="16" height="16" />
|
||||
- 集成 [ArchiSteamFarm](https://github.com/JustArchiNET/ArchiSteamFarm) 在应用内提供 挂机掉落 Steam 集换式卡牌 等功能。
|
||||
7. 游戏工具 <img src="./res/brands/windows.svg" width="16" height="16" />
|
||||
- 强制游戏窗口使用无边框窗口化、更多功能待开发。
|
||||
|
||||
<!--发布配置SelfContained=true时会自动打包VC++相关程序集-->
|
||||
<!--先决条件 Microsoft Visual C++ 2015-2019 Redistributable [64 位](https://aka.ms/vs/16/release/vc_redist.x64.exe) / [32 位](https://aka.ms/vs/16/release/vc_redist.x86.exe)-->
|
||||
## 🖥 系统要求
|
||||
- 桌面端(仅支持 64 位)
|
||||
- Windows 10 1607+ / Windows Server 版本 1903+ / Windows Server 2019 / Windows Server 2016
|
||||
- Windows 8.1 / Windows Server 2012 R2
|
||||
- Windows 7 SP1 [ESU](https://docs.microsoft.com/zh-cn/troubleshoot/windows-client/windows-7-eos-faq/windows-7-extended-security-updates-faq)
|
||||
- 先决条件
|
||||
- KB3063858 [64 位](https://www.microsoft.com/zh-cn/download/details.aspx?id=47442) / [32 位](https://www.microsoft.com/zh-cn/download/details.aspx?id=47409)
|
||||
- macOS 10.13 High Sierra 或更高版本
|
||||
- Linux 发行版
|
||||
- Arch Linux
|
||||
- Alpine Linux 3.11+
|
||||
- CentOS 7+
|
||||
- Debian 9+
|
||||
- Deepin 20.1 / UOS 20
|
||||
- Fedora 32+
|
||||
- Linux Mint 18+
|
||||
- openSUSE 15+
|
||||
- Red Hat Enterprise Linux 7+
|
||||
- SUSE Enterprise Linux (SLES) 12 SP2+
|
||||
- Ubuntu 20.10, 20.04, 18.04, 16.04
|
||||
- 移动端(仅支持 ARM64 或 ARM32)
|
||||
- Android 5.0+
|
||||
- iOS 10.0+
|
||||
## 🖥 支持的操作系统
|
||||
- Windows 11
|
||||
- Windows 10 版本 1809(OS 内部版本 17763)或更高版本
|
||||
- macOS 10.15 或更高版本
|
||||
- Ubuntu 18.04 或更高版本
|
||||
- Debian 10 或更高版本
|
||||
- CentOS 7 或更高版本
|
||||
- Deepin(UOS) 20 或更高版本
|
||||
- ~~iOS 11 或更高版本~~(开发中…)
|
||||
- Android 5.0(API 21) 或更高版本
|
||||
|
||||
## ⛔ 不受支持的操作系统
|
||||
- Windows 8
|
||||
- [由于微软官方对该产品的支持已结束](https://docs.microsoft.com/zh-cn/lifecycle/products/windows-8),故本程序无法在此操作系统上运行,[建议升级到 Windows 8.1](https://support.microsoft.com/zh-cn/windows/%E4%BB%8E-windows-8-%E6%9B%B4%E6%96%B0%E5%88%B0-windows-8-1-17fc54a7-a465-6b5a-c1a0-34140afd0669)
|
||||
- Windows Server 2012 / 2008 R2 SP1
|
||||
- 仅可使用 1.X 版本,2.X 开始不受支持,建议升级到 **Windows Server 2012 R2** 或更高版本
|
||||
- 无桌面 GUI 的 Windows Server / Linux 版本
|
||||
## 🧩 截图
|
||||
<img src="./res/screenshots/screenshot-windows-accelerator.webp" width="800" />
|
||||
<br/>
|
||||
<br/>
|
||||
<img src="./res/screenshots/screenshot-android-authenticator.png" width="800" />
|
||||
|
||||
## 从移动端 Steam App 导入令牌指南
|
||||
- [Android 添加本地令牌(Xposed)](https://github.com/BeyondDimension/SteamTools/issues/2276)
|
||||
- [iOS 添加本地令牌(无需越狱/网络抓包)](https://github.com/BeyondDimension/SteamTools/issues/2129)
|
||||
- [iOS 添加本地令牌(无需越狱/iTunes 备份)](https://github.com/BeyondDimension/SteamTools/issues/299)
|
||||
- [iOS 添加本地令牌(需越狱)](https://github.com/BeyondDimension/SteamTools/issues/95)
|
||||
|
||||
## 🌏 路线图
|
||||
查看这个 [milestones](https://github.com/SteamTools-Team/SteamTools/milestones) 来了解我们下一步的开发计划,并随时提出问题。
|
||||
查看这个 [milestones](https://github.com/BeyondDimension/SteamTools/milestones) 来了解我们下一步的开发计划,并随时提出问题。
|
||||
|
||||
## ⌨️ 开发环境
|
||||
[Visual Studio 2019 版本 16.10 或更高版本](https://visualstudio.microsoft.com/zh-hans/vs/) 或 [JetBrains Rider](https://www.jetbrains.com/rider/) 或 ~~[Visual Studio for Mac](https://visualstudio.microsoft.com/zh-hans/vs/mac/)~~ 或 ~~[Visual Studio Code](https://code.visualstudio.com/)~~
|
||||
[Visual Studio 2022](https://visualstudio.microsoft.com/zh-hans/vs) 或 [Visual Studio 2022 for Mac](https://visualstudio.microsoft.com/zh-hans/vs/mac)
|
||||
- 系统要求
|
||||
- [Windows 10 版本 2004 或更高版本:家庭版、专业版、教育版和企业版(不支持 LTSC 和 Windows 10 S,在较早的操作系统上可能不受支持)](https://docs.microsoft.com/zh-cn/visualstudio/releases/2019/system-requirements)
|
||||
- [macOS 10.13 High Sierra 或更高版本](https://docs.microsoft.com/zh-cn/visualstudio/productinfo/vs2019-system-requirements-mac)
|
||||
- 工作负载
|
||||
- [Windows 11 版本 21H2 或更高版本:家庭版、专业版、专业教育版、专业工作站版、企业版和教育版](https://learn.microsoft.com/zh-cn/visualstudio/releases/2022/system-requirements)
|
||||
- [macOS Big Sur 11.0 或更高版本](https://learn.microsoft.com/zh-cn/visualstudio/releases/2022/mac-system-requirements)
|
||||
- 工作负荷
|
||||
- Web 和云
|
||||
- ASP.NET 和 Web 开发
|
||||
- 桌面应用和移动应用
|
||||
- 使用 .NET 的移动开发 / .NET Multi-platform App UI 开发
|
||||
- .NET 桌面开发
|
||||
- 通用 Windows 平台开发
|
||||
- 使用 .NET 的移动开发
|
||||
- 其他工具集
|
||||
- .NET Core 跨平台开发
|
||||
- 单个组件
|
||||
- GitHub Extension for Visual Studio
|
||||
- Windows 10 SDK (10.0.19041.0)
|
||||
- [Visual Studio Marketplace](https://marketplace.visualstudio.com/)
|
||||
- [Avalonia for Visual Studio](https://marketplace.visualstudio.com/items?itemName=AvaloniaTeam.AvaloniaforVisualStudio)
|
||||
- [NUnit VS Templates](https://marketplace.visualstudio.com/items?itemName=NUnitDevelopers.NUnitTemplatesforVisualStudio)
|
||||
- GitHub Extension for Visual Studio(可选)
|
||||
- [Visual Studio Marketplace](https://marketplace.visualstudio.com)
|
||||
- [Avalonia for Visual Studio(可选)](https://marketplace.visualstudio.com/items?itemName=AvaloniaTeam.AvaloniaforVisualStudio)
|
||||
- [NUnit VS Templates(可选)](https://marketplace.visualstudio.com/items?itemName=NUnitDevelopers.NUnitTemplatesforVisualStudio)
|
||||
|
||||
[JetBrains Rider](https://www.jetbrains.com/rider)
|
||||
[Visual Studio Code](https://code.visualstudio.com)
|
||||
[OpenJDK 17](https://learn.microsoft.com/zh-cn/java/openjdk/download#openjdk-17)
|
||||
[Android Studio Electric Eel 或更高版本](https://developer.android.google.cn/studio)
|
||||
[Xcode 14 或更高版本](https://developer.apple.com/xcode)
|
||||
|
||||
## 🏗️ [项目结构](./src/README.md)
|
||||
详见 [./src/README.md](./src/README.md)
|
||||
|
||||
## 🧑💼 加入我们
|
||||
- [.NET/C# 高级软件工程师(客户端方向)](https://www.zhipin.com/job_detail/b271a34a3efeb84c1XJ_2dW6ElVT.html)
|
||||
- [.NET/C# 高级软件工程师](https://www.zhipin.com/job_detail/0164142566ff52d71XJ_2dW7GVVW.html)
|
||||
|
||||
<!--
|
||||
- [.NET/C# 软件工程师](https://www.zhipin.com/job_detail/80c0ad0f424e2ea61XJ_2t6-GVVZ.html)
|
||||
- [高级 Web 前端工程师](https://www.zhipin.com/job_detail/e59317c527f3f49e1XJ92d24FVRV.html)
|
||||
-->
|
||||
|
||||
<!--👇图标如果发生更改,还需更改 Tools.OpenSourceLibraryList(Program.OpenSourceLibraryListEmoji) -->
|
||||
## 📄 感谢以下开源项目
|
||||
* [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json)
|
||||
* [MetroRadiance](https://github.com/Grabacr07/MetroRadiance)
|
||||
* [MetroTrilithon](https://github.com/Grabacr07/MetroTrilithon)
|
||||
* [Livet](https://github.com/runceel/Livet)
|
||||
* [StatefulModel](https://github.com/ugaya40/StatefulModel)
|
||||
* [Hardcodet.NotifyIcon](https://github.com/HavenDV/Hardcodet.NotifyIcon.Wpf.NetCore)
|
||||
* [System.Reactive](https://github.com/dotnet/reactive)
|
||||
* [Titanium-Web-Proxy](https://github.com/justcoding121/Titanium-Web-Proxy)
|
||||
* [BrotliSharpLib](https://github.com/master131/BrotliSharpLib)
|
||||
* [YARP](https://github.com/microsoft/reverse-proxy)
|
||||
* [FastGithub](https://github.com/dotnetcore/FastGithub)
|
||||
* [Portable.BouncyCastle](https://github.com/novotnyllc/bc-csharp)
|
||||
* [Ninject](https://github.com/ninject/Ninject)
|
||||
* [log4net](https://github.com/apache/logging-log4net)
|
||||
* [SteamDB-API](https://github.com/SteamDB-API/api)
|
||||
* [SteamAchievementManager](https://github.com/gibbed/SteamAchievementManager)
|
||||
* [ArchiSteamFarm](https://github.com/JustArchiNET/ArchiSteamFarm)
|
||||
* [Steam4NET](https://github.com/SteamRE/Steam4NET)
|
||||
@@ -128,16 +136,20 @@
|
||||
* [SteamDesktopAuthenticator](https://github.com/Jessecar96/SteamDesktopAuthenticator)
|
||||
* [Gameloop.Vdf](https://github.com/shravan2x/Gameloop.Vdf)
|
||||
* [DnsClient.NET](https://github.com/MichaCo/DnsClient.NET)
|
||||
* [Costura.Fody](https://github.com/Fody/Costura)
|
||||
* [MessagePack-CSharp](https://github.com/neuecc/MessagePack-CSharp)
|
||||
* [MemoryPack](https://github.com/Cysharp/MemoryPack)
|
||||
* [CSharpVitamins.ShortGuid](https://github.com/AigioL/CSharpVitamins.ShortGuid)
|
||||
* [Nito.Comparers](https://github.com/StephenCleary/Comparers)
|
||||
* [Nito.Disposables](https://github.com/StephenCleary/Disposables)
|
||||
* [Crc32.NET](https://github.com/force-net/Crc32.NET)
|
||||
* [gfoidl.Base64](https://github.com/gfoidl/Base64)
|
||||
* [sqlite-net-pcl](https://github.com/praeclarum/sqlite-net)
|
||||
* [AutoMapper](https://github.com/AutoMapper/AutoMapper)
|
||||
* [Polly](https://github.com/App-vNext/Polly)
|
||||
* [TaskScheduler](https://github.com/dahall/taskscheduler)
|
||||
* [SharpZipLib](https://github.com/icsharpcode/SharpZipLib)
|
||||
* [LibVLCSharp](https://github.com/videolan/libvlcsharp)
|
||||
* [SevenZipSharp](https://github.com/squid-box/SevenZipSharp)
|
||||
* [ZstdNet](https://github.com/skbkontur/ZstdNet)
|
||||
* [Depressurizer](https://github.com/Depressurizer/Depressurizer)
|
||||
* [NLog](https://github.com/nlog/NLog)
|
||||
* [NUnit](https://github.com/nunit/nunit)
|
||||
@@ -146,28 +158,38 @@
|
||||
* [AvaloniaUI](https://github.com/AvaloniaUI/Avalonia)
|
||||
* [AvaloniaGif](https://github.com/jmacato/AvaloniaGif)
|
||||
* [Avalonia XAML Behaviors](https://github.com/wieslawsoltes/AvaloniaBehaviors)
|
||||
* [FluentAvalonia](https://github.com/amwx/FluentAvalonia)
|
||||
* [APNG.NET](https://github.com/jz5/APNG.NET)
|
||||
* [Chromium Embedded Framework (CEF)](https://github.com/chromiumembedded/cef)
|
||||
* [Moq](https://github.com/moq/moq4)
|
||||
* [NPOI](https://github.com/nissl-lab/npoi)
|
||||
* [Fleck](https://github.com/statianzo/Fleck)
|
||||
* [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore)
|
||||
* [AspNet.Security.OpenId.Providers](https://github.com/aspnet-contrib/AspNet.Security.OpenId.Providers)
|
||||
* [AspNet.Security.OAuth.Providers](https://github.com/aspnet-contrib/AspNet.Security.OAuth.Providers)
|
||||
* [CefNet](https://github.com/CefNet/CefNet)
|
||||
* [CefSharp](https://github.com/cefsharp/CefSharp)
|
||||
* [ZXing.Net](https://github.com/micjahn/ZXing.Net)
|
||||
* [QRCoder](https://github.com/codebude/QRCoder)
|
||||
* [QR Code Generator for .NET](https://github.com/manuelbl/QrCodeGenerator)
|
||||
* [TinyPinyin](https://github.com/promeG/TinyPinyin)
|
||||
* [TinyPinyin.Net](https://github.com/hueifeng/TinyPinyin.Net)
|
||||
* [Packaging utilities for .NET Core](https://github.com/qmfrederik/dotnet-packaging)
|
||||
* [React](https://github.com/facebook/react)
|
||||
* [Ant Design](https://github.com/ant-design/ant-design)
|
||||
* [Ant Design Blazor](https://github.com/ant-design-blazor/ant-design-blazor)
|
||||
* [Toast messages for Xamarin.iOS](https://github.com/andrius-k/Toast)
|
||||
* [XF.Material Library](https://github.com/Baseflow/XF-Material-Library)
|
||||
* [ImageCirclePlugin](https://github.com/jamesmontemagno/ImageCirclePlugin)
|
||||
* [Visual Studio App Center SDK for .NET](https://github.com/microsoft/appcenter-sdk-dotnet)
|
||||
* [AppCenter-XMac](https://github.com/nor0x/AppCenter-XMac)
|
||||
* [MSBuild.Sdk.Extras](https://github.com/novotnyllc/MSBuildSdkExtras)
|
||||
* [Xamarin.Essentials](https://github.com/xamarin/essentials)
|
||||
* [Xamarin.Forms](https://github.com/xamarin/Xamarin.Forms)
|
||||
* [Open Source Components for Xamarin](https://github.com/xamarin/XamarinComponents)
|
||||
* [Google Play Services / Firebase / ML Kit for Xamarin.Android](https://github.com/xamarin/GooglePlayServicesComponents)
|
||||
* [Picasso](https://github.com/square/picasso)
|
||||
* [OkHttp](https://github.com/square/okhttp)
|
||||
* [Material Components for Android](https://github.com/material-components/material-components-android)
|
||||
* [AndroidX for Xamarin.Android](https://github.com/xamarin/AndroidX)
|
||||
* [MSAL.NET](https://github.com/AzureAD/microsoft-authentication-library-for-dotnet)
|
||||
* [Android Jetpack](https://github.com/androidx/androidx)
|
||||
* [ConstraintLayout](https://github.com/androidx/constraintlayout)
|
||||
* [Entity Framework Core](https://github.com/dotnet/efcore)
|
||||
* [ASP.NET Core](https://github.com/dotnet/aspnetcore)
|
||||
* [Windows Forms](https://github.com/dotnet/winforms)
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.31005.135
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Blazor.BackManage.Server", "src\ST.Blazor.BackManage\Server\ST.Blazor.BackManage.Server.csproj", "{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Blazor.BackManage.Client", "src\ST.Blazor.BackManage\Client\ST.Blazor.BackManage.Client.csproj", "{AB1EB396-ABBE-4CEA-A650-950A68440391}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Root", "_Root", "{3449FCD6-B7EB-40DF-A76A-6E22A8FB3A2F}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
src\ST.Blazor.BackManage\README.md = src\ST.Blazor.BackManage\README.md
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Release|x64.Build.0 = Release|Any CPU
|
||||
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{7A8C458A-DF0B-4B20-BCBF-A433B6F6046A}.Release|x86.Build.0 = Release|Any CPU
|
||||
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Release|x64.Build.0 = Release|Any CPU
|
||||
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{AB1EB396-ABBE-4CEA-A650-950A68440391}.Release|x86.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {10D95A49-D583-49CD-8224-15A402FBEE1D}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -0,0 +1,345 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.5.33414.496
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "0.Root", "0.Root", "{46259E8D-32A4-4065-953D-D6F835B57A28}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
src\.editorconfig = src\.editorconfig
|
||||
.gitignore = .gitignore
|
||||
.gitmodules = .gitmodules
|
||||
src\Directory.Build.props = src\Directory.Build.props
|
||||
ref\DirectoryPackages\Directory.Packages.props = ref\DirectoryPackages\Directory.Packages.props
|
||||
NuGet.Config = NuGet.Config
|
||||
README.en.md = README.en.md
|
||||
README.md = README.md
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "1.AppHost", "1.AppHost", "{5541B406-4A9A-4AC8-AA77-CE14E133DB80}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "2.Reference", "2.Reference", "{90E88965-DB90-4B49-94F5-6D2965491988}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "3.Test", "3.Test", "{6AF591CA-B0C4-425B-9293-9E62F5BE9B3D}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "4.Shared", "4.Shared", "{CE475939-6363-4144-B18F-2F91CC297E91}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "5.Plugins", "5.Plugins", "{A5828819-62AB-4B03-A083-8B6ED4915AA3}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Document", "Document", "{1E1DFB1C-55FC-4D74-9791-6A692E647034}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
doc\download-guide.en.md = doc\download-guide.en.md
|
||||
doc\download-guide.md = doc\download-guide.md
|
||||
doc\openwrt.md = doc\openwrt.md
|
||||
doc\release-keylol.md = doc\release-keylol.md
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Source", "Source", "{202026AE-894E-4E18-9846-B0739CDBE3E9}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
src\AssemblyInfo.Constants.cs = src\AssemblyInfo.Constants.cs
|
||||
src\AssemblyInfo.cs = src\AssemblyInfo.cs
|
||||
src\AssemblyInfo.Version.Max.cs = src\AssemblyInfo.Version.Max.cs
|
||||
src\README.md = src\README.md
|
||||
src\Utils.cs = src\Utils.cs
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ImplicitUsings", "ImplicitUsings", "{F776BA87-0B9B-4C3C-B04F-688DCC021BF1}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
src\ImplicitUsings.ArchiSteamFarm.cs = src\ImplicitUsings.ArchiSteamFarm.cs
|
||||
src\ImplicitUsings.AspNetCore.cs = src\ImplicitUsings.AspNetCore.cs
|
||||
src\ImplicitUsings.AutoMapper.cs = src\ImplicitUsings.AutoMapper.cs
|
||||
src\ImplicitUsings.Avalonia.cs = src\ImplicitUsings.Avalonia.cs
|
||||
src\ImplicitUsings.BCL.cs = src\ImplicitUsings.BCL.cs
|
||||
src\ImplicitUsings.Common.cs = src\ImplicitUsings.Common.cs
|
||||
src\ImplicitUsings.Controllers.cs = src\ImplicitUsings.Controllers.cs
|
||||
src\ImplicitUsings.Data.cs = src\ImplicitUsings.Data.cs
|
||||
src\ImplicitUsings.EntityFrameworkCore.cs = src\ImplicitUsings.EntityFrameworkCore.cs
|
||||
src\ImplicitUsings.Identity.cs = src\ImplicitUsings.Identity.cs
|
||||
src\ImplicitUsings.Jobs.cs = src\ImplicitUsings.Jobs.cs
|
||||
src\ImplicitUsings.JsonProperty.cs = src\ImplicitUsings.JsonProperty.cs
|
||||
src\ImplicitUsings.JWT.cs = src\ImplicitUsings.JWT.cs
|
||||
src\ImplicitUsings.MessagePack.cs = src\ImplicitUsings.MessagePack.cs
|
||||
src\ImplicitUsings.Models.cs = src\ImplicitUsings.Models.cs
|
||||
src\ImplicitUsings.MSEX.cs = src\ImplicitUsings.MSEX.cs
|
||||
src\ImplicitUsings.Nito.cs = src\ImplicitUsings.Nito.cs
|
||||
src\ImplicitUsings.NLog.cs = src\ImplicitUsings.NLog.cs
|
||||
src\ImplicitUsings.Plugins.cs = src\ImplicitUsings.Plugins.cs
|
||||
src\ImplicitUsings.Quartz.cs = src\ImplicitUsings.Quartz.cs
|
||||
src\ImplicitUsings.ReactiveUI.cs = src\ImplicitUsings.ReactiveUI.cs
|
||||
src\ImplicitUsings.Repositories.cs = src\ImplicitUsings.Repositories.cs
|
||||
src\ImplicitUsings.Services.cs = src\ImplicitUsings.Services.cs
|
||||
src\ImplicitUsings.Settings.cs = src\ImplicitUsings.Settings.cs
|
||||
src\ImplicitUsings.SQLite.cs = src\ImplicitUsings.SQLite.cs
|
||||
src\ImplicitUsings.Steam.cs = src\ImplicitUsings.Steam.cs
|
||||
src\ImplicitUsings.UI.cs = src\ImplicitUsings.UI.cs
|
||||
src\ImplicitUsings.UI.ViewModels.cs = src\ImplicitUsings.UI.ViewModels.cs
|
||||
src\ImplicitUsings.UI.Views.cs = src\ImplicitUsings.UI.Views.cs
|
||||
src\ImplicitUsings.UnitTest.cs = src\ImplicitUsings.UnitTest.cs
|
||||
src\ImplicitUsings.WTTS.cs = src\ImplicitUsings.WTTS.cs
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TFM", "TFM", "{3B0CFC2A-F61B-4000-AC12-6E0AFB5C475C}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
src\TFM_NET7.props = src\TFM_NET7.props
|
||||
src\TFM_NET7_WINDOWS.props = src\TFM_NET7_WINDOWS.props
|
||||
src\TFM_NET7_WITH_ALL.props = src\TFM_NET7_WITH_ALL.props
|
||||
src\TFM_NET7_WITH_DESKTOP.props = src\TFM_NET7_WITH_DESKTOP.props
|
||||
src\TFM_NET7_WITH_WINDOWS.props = src\TFM_NET7_WITH_WINDOWS.props
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ArchiSteamFarm.Library", "ref\ArchiSteamFarm\ArchiSteamFarm.Library\ArchiSteamFarm.Library.csproj", "{6981D5CA-837C-47F8-9568-E3BD451A6C68}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibAPNG", "ref\Avalonia.Image2\LibAPNG\LibAPNG.csproj", "{47B2D651-8EE0-4C05-B451-F2DA264DD5B3}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AvaloniaGif", "ref\Avalonia.Image2\AvaloniaGif\AvaloniaGif.csproj", "{5D6D28A7-1CD8-4C30-A0E4-1F8ACF389A29}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ArchiSteamFarm", "ArchiSteamFarm", "{A3A703CC-F22E-40CE-9064-6DF3E55DD556}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Avalonia", "Avalonia", "{E5732454-7455-4078-88A2-E727DCC64D26}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ReverseProxy", "ReverseProxy", "{4FA9B783-ADAE-46F6-9AAD-ED32F1839F13}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Steam", "Steam", "{99D97BD4-3F51-48BC-8BD2-647F6D268BB0}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Titanium.Web.Proxy", "ref\Titanium-Web-Proxy\src\Titanium.Web.Proxy\Titanium.Web.Proxy.csproj", "{826716DC-65C2-456A-BB6D-5FDEC423E4E6}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Gameloop.Vdf", "ref\Gameloop.Vdf\Gameloop.Vdf\Gameloop.Vdf.csproj", "{FE91B979-FE45-43F3-B9C4-430F2360FDDF}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Steam4NET", "ref\Steam4NET\Steam4NET\Steam4NET.csproj", "{C8792BC7-33C0-41D4-97F6-684AD4B0B6A5}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SAM.API", "ref\SteamAchievementManager\SAM.API\SAM.API.csproj", "{123F532B-4178-4D03-A4EE-2A8F3E01433F}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.UnitTest", "src\BD.WTTS.UnitTest\BD.WTTS.UnitTest.csproj", "{B1131172-0748-4003-83ED-71574FD6331A}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client", "src\BD.WTTS.Client\BD.WTTS.Client.csproj", "{125FB003-F154-425F-AD3F-A1D92977D353}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Avalonia.Ref", "Avalonia.Ref", "{1BD19276-7DEF-4659-9DBF-28E8E5078698}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Skia.Internals", "src\Avalonia.Skia.Internals\Avalonia.Skia.Internals.csproj", "{06360884-9EEC-49E3-8787-BE593D08AE44}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Desktop", "src\Avalonia.Desktop\Avalonia.Desktop.csproj", "{D0CB210C-67BD-4F8D-9AD6-D6ABEF845CE7}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Diagnostics", "src\Avalonia.Diagnostics\Avalonia.Diagnostics.csproj", "{20629279-8E17-49D2-9A30-352972F4F699}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Native", "src\Avalonia.Native\Avalonia.Native.csproj", "{09343C10-49B7-43F7-BEA3-F4F51BFC767C}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Themes.Default", "src\Avalonia.Themes.Default\Avalonia.Themes.Default.csproj", "{2AEAE82F-C690-4F19-BD60-03BA717EA350}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Themes.Fluent", "src\Avalonia.Themes.Fluent\Avalonia.Themes.Fluent.csproj", "{1C2D25C2-4CF5-439E-9672-BE8750F15CCA}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.WebView2", "src\Avalonia.WebView2\Avalonia.WebView2.csproj", "{124CB400-9E02-44CC-A8ED-56CBED8B52B6}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Win32", "src\Avalonia.Win32\Avalonia.Win32.csproj", "{79C8C554-451D-4D5D-9E4C-AB7E4174568C}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.X11", "src\Avalonia.X11\Avalonia.X11.csproj", "{CE9BD09A-730F-4BB0-B1B0-FA692B6DD1C7}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.Avalonia.App", "src\BD.WTTS.Client.Avalonia.App\BD.WTTS.Client.Avalonia.App.csproj", "{A1EE03F3-6736-4D0E-AC80-FDB72EFE705C}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.Plugins.Accelerator", "src\BD.WTTS.Client.Plugins.Accelerator\BD.WTTS.Client.Plugins.Accelerator.csproj", "{085B609C-083F-4698-9508-563CD6A8E71D}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.Plugins.GameAccount", "src\BD.WTTS.Client.Plugins.GameAccount\BD.WTTS.Client.Plugins.GameAccount.csproj", "{4D8D93B0-1B94-4FF7-BC36-B22AF3AEA41A}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.Plugins.ArchiSteamFarmPlus", "src\BD.WTTS.Client.Plugins.ArchiSteamFarmPlus\BD.WTTS.Client.Plugins.ArchiSteamFarmPlus.csproj", "{CABDF6AC-7AE0-445D-A4BE-BC9CD0B59AA5}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.Plugins.GameList", "src\BD.WTTS.Client.Plugins.GameList\BD.WTTS.Client.Plugins.GameList.csproj", "{A36BA15F-11FF-41E3-B488-7D84152C4CE9}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.Plugins.GameTools", "src\BD.WTTS.Client.Plugins.GameTools\BD.WTTS.Client.Plugins.GameTools.csproj", "{E959F339-B52B-44A1-85EC-D5FB384255E5}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.Plugins.Authenticator", "src\BD.WTTS.Client.Plugins.Authenticator\BD.WTTS.Client.Plugins.Authenticator.csproj", "{861E33DB-C9C0-4C40-9042-75F7740F6DED}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.Plugins.Update", "src\BD.WTTS.Client.Plugins.Update\BD.WTTS.Client.Plugins.Update.csproj", "{8DED0728-D54E-4A1E-B1D1-3740EC04ABAA}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.AppHost", "src\BD.WTTS.Client.AppHost\BD.WTTS.Client.AppHost.csproj", "{AC034643-EC5B-4BCD-BD1A-007FC3C50DF4}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.Plugins.Accelerator.ReverseProxy", "src\BD.WTTS.Client.Plugins.Accelerator.ReverseProxy\BD.WTTS.Client.Plugins.Accelerator.ReverseProxy.csproj", "{521D4676-8E8A-4A4C-9835-B09FF4AFFBBC}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BD.WTTS.Client.IPC", "src\BD.WTTS.Client.IPC\BD.WTTS.Client.IPC.csproj", "{407BE171-FB57-4C39-BF26-7FAF4450635F}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{09F4FC1E-88A6-4264-9871-C0AF59DEA89D}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
build\publish_apphost_linux_x64.sh = build\publish_apphost_linux_x64.sh
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Controls.Internals", "src\Avalonia.Controls.Internals\Avalonia.Controls.Internals.csproj", "{BAEF69C3-9347-424D-B2B4-74BD2B3C90F9}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Base", "src\Avalonia.Base\Avalonia.Base.csproj", "{02B5BE74-E75D-4573-B640-58DF2B01B4E9}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{6981D5CA-837C-47F8-9568-E3BD451A6C68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{6981D5CA-837C-47F8-9568-E3BD451A6C68}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{6981D5CA-837C-47F8-9568-E3BD451A6C68}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{6981D5CA-837C-47F8-9568-E3BD451A6C68}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{47B2D651-8EE0-4C05-B451-F2DA264DD5B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{47B2D651-8EE0-4C05-B451-F2DA264DD5B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{47B2D651-8EE0-4C05-B451-F2DA264DD5B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{47B2D651-8EE0-4C05-B451-F2DA264DD5B3}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{5D6D28A7-1CD8-4C30-A0E4-1F8ACF389A29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{5D6D28A7-1CD8-4C30-A0E4-1F8ACF389A29}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{5D6D28A7-1CD8-4C30-A0E4-1F8ACF389A29}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{5D6D28A7-1CD8-4C30-A0E4-1F8ACF389A29}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{826716DC-65C2-456A-BB6D-5FDEC423E4E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{826716DC-65C2-456A-BB6D-5FDEC423E4E6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{826716DC-65C2-456A-BB6D-5FDEC423E4E6}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{826716DC-65C2-456A-BB6D-5FDEC423E4E6}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{FE91B979-FE45-43F3-B9C4-430F2360FDDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{FE91B979-FE45-43F3-B9C4-430F2360FDDF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{FE91B979-FE45-43F3-B9C4-430F2360FDDF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{FE91B979-FE45-43F3-B9C4-430F2360FDDF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{C8792BC7-33C0-41D4-97F6-684AD4B0B6A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{C8792BC7-33C0-41D4-97F6-684AD4B0B6A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{C8792BC7-33C0-41D4-97F6-684AD4B0B6A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C8792BC7-33C0-41D4-97F6-684AD4B0B6A5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{123F532B-4178-4D03-A4EE-2A8F3E01433F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{123F532B-4178-4D03-A4EE-2A8F3E01433F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{123F532B-4178-4D03-A4EE-2A8F3E01433F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{123F532B-4178-4D03-A4EE-2A8F3E01433F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B1131172-0748-4003-83ED-71574FD6331A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B1131172-0748-4003-83ED-71574FD6331A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B1131172-0748-4003-83ED-71574FD6331A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B1131172-0748-4003-83ED-71574FD6331A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{125FB003-F154-425F-AD3F-A1D92977D353}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{125FB003-F154-425F-AD3F-A1D92977D353}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{125FB003-F154-425F-AD3F-A1D92977D353}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{125FB003-F154-425F-AD3F-A1D92977D353}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{06360884-9EEC-49E3-8787-BE593D08AE44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{06360884-9EEC-49E3-8787-BE593D08AE44}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{06360884-9EEC-49E3-8787-BE593D08AE44}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{06360884-9EEC-49E3-8787-BE593D08AE44}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{D0CB210C-67BD-4F8D-9AD6-D6ABEF845CE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D0CB210C-67BD-4F8D-9AD6-D6ABEF845CE7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D0CB210C-67BD-4F8D-9AD6-D6ABEF845CE7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D0CB210C-67BD-4F8D-9AD6-D6ABEF845CE7}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{20629279-8E17-49D2-9A30-352972F4F699}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{20629279-8E17-49D2-9A30-352972F4F699}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{20629279-8E17-49D2-9A30-352972F4F699}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{20629279-8E17-49D2-9A30-352972F4F699}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{09343C10-49B7-43F7-BEA3-F4F51BFC767C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{09343C10-49B7-43F7-BEA3-F4F51BFC767C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{09343C10-49B7-43F7-BEA3-F4F51BFC767C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{09343C10-49B7-43F7-BEA3-F4F51BFC767C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{2AEAE82F-C690-4F19-BD60-03BA717EA350}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{2AEAE82F-C690-4F19-BD60-03BA717EA350}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{2AEAE82F-C690-4F19-BD60-03BA717EA350}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{2AEAE82F-C690-4F19-BD60-03BA717EA350}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{1C2D25C2-4CF5-439E-9672-BE8750F15CCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{1C2D25C2-4CF5-439E-9672-BE8750F15CCA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{1C2D25C2-4CF5-439E-9672-BE8750F15CCA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{1C2D25C2-4CF5-439E-9672-BE8750F15CCA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{124CB400-9E02-44CC-A8ED-56CBED8B52B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{124CB400-9E02-44CC-A8ED-56CBED8B52B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{124CB400-9E02-44CC-A8ED-56CBED8B52B6}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{124CB400-9E02-44CC-A8ED-56CBED8B52B6}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{79C8C554-451D-4D5D-9E4C-AB7E4174568C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{79C8C554-451D-4D5D-9E4C-AB7E4174568C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{79C8C554-451D-4D5D-9E4C-AB7E4174568C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{79C8C554-451D-4D5D-9E4C-AB7E4174568C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{CE9BD09A-730F-4BB0-B1B0-FA692B6DD1C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{CE9BD09A-730F-4BB0-B1B0-FA692B6DD1C7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{CE9BD09A-730F-4BB0-B1B0-FA692B6DD1C7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{CE9BD09A-730F-4BB0-B1B0-FA692B6DD1C7}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{A1EE03F3-6736-4D0E-AC80-FDB72EFE705C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{A1EE03F3-6736-4D0E-AC80-FDB72EFE705C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A1EE03F3-6736-4D0E-AC80-FDB72EFE705C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{A1EE03F3-6736-4D0E-AC80-FDB72EFE705C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{085B609C-083F-4698-9508-563CD6A8E71D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{085B609C-083F-4698-9508-563CD6A8E71D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{085B609C-083F-4698-9508-563CD6A8E71D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{085B609C-083F-4698-9508-563CD6A8E71D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{4D8D93B0-1B94-4FF7-BC36-B22AF3AEA41A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{4D8D93B0-1B94-4FF7-BC36-B22AF3AEA41A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{4D8D93B0-1B94-4FF7-BC36-B22AF3AEA41A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{4D8D93B0-1B94-4FF7-BC36-B22AF3AEA41A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{CABDF6AC-7AE0-445D-A4BE-BC9CD0B59AA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{CABDF6AC-7AE0-445D-A4BE-BC9CD0B59AA5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{CABDF6AC-7AE0-445D-A4BE-BC9CD0B59AA5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{CABDF6AC-7AE0-445D-A4BE-BC9CD0B59AA5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{A36BA15F-11FF-41E3-B488-7D84152C4CE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{A36BA15F-11FF-41E3-B488-7D84152C4CE9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A36BA15F-11FF-41E3-B488-7D84152C4CE9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{A36BA15F-11FF-41E3-B488-7D84152C4CE9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{E959F339-B52B-44A1-85EC-D5FB384255E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{E959F339-B52B-44A1-85EC-D5FB384255E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E959F339-B52B-44A1-85EC-D5FB384255E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E959F339-B52B-44A1-85EC-D5FB384255E5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{861E33DB-C9C0-4C40-9042-75F7740F6DED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{861E33DB-C9C0-4C40-9042-75F7740F6DED}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{861E33DB-C9C0-4C40-9042-75F7740F6DED}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{861E33DB-C9C0-4C40-9042-75F7740F6DED}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{8DED0728-D54E-4A1E-B1D1-3740EC04ABAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{8DED0728-D54E-4A1E-B1D1-3740EC04ABAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{8DED0728-D54E-4A1E-B1D1-3740EC04ABAA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{8DED0728-D54E-4A1E-B1D1-3740EC04ABAA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{AC034643-EC5B-4BCD-BD1A-007FC3C50DF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{AC034643-EC5B-4BCD-BD1A-007FC3C50DF4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{AC034643-EC5B-4BCD-BD1A-007FC3C50DF4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{AC034643-EC5B-4BCD-BD1A-007FC3C50DF4}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{521D4676-8E8A-4A4C-9835-B09FF4AFFBBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{521D4676-8E8A-4A4C-9835-B09FF4AFFBBC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{521D4676-8E8A-4A4C-9835-B09FF4AFFBBC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{521D4676-8E8A-4A4C-9835-B09FF4AFFBBC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{407BE171-FB57-4C39-BF26-7FAF4450635F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{407BE171-FB57-4C39-BF26-7FAF4450635F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{407BE171-FB57-4C39-BF26-7FAF4450635F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{407BE171-FB57-4C39-BF26-7FAF4450635F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{BAEF69C3-9347-424D-B2B4-74BD2B3C90F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{BAEF69C3-9347-424D-B2B4-74BD2B3C90F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{BAEF69C3-9347-424D-B2B4-74BD2B3C90F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{BAEF69C3-9347-424D-B2B4-74BD2B3C90F9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{02B5BE74-E75D-4573-B640-58DF2B01B4E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{02B5BE74-E75D-4573-B640-58DF2B01B4E9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{02B5BE74-E75D-4573-B640-58DF2B01B4E9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{02B5BE74-E75D-4573-B640-58DF2B01B4E9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(NestedProjects) = preSolution
|
||||
{1E1DFB1C-55FC-4D74-9791-6A692E647034} = {46259E8D-32A4-4065-953D-D6F835B57A28}
|
||||
{202026AE-894E-4E18-9846-B0739CDBE3E9} = {46259E8D-32A4-4065-953D-D6F835B57A28}
|
||||
{F776BA87-0B9B-4C3C-B04F-688DCC021BF1} = {202026AE-894E-4E18-9846-B0739CDBE3E9}
|
||||
{3B0CFC2A-F61B-4000-AC12-6E0AFB5C475C} = {46259E8D-32A4-4065-953D-D6F835B57A28}
|
||||
{6981D5CA-837C-47F8-9568-E3BD451A6C68} = {A3A703CC-F22E-40CE-9064-6DF3E55DD556}
|
||||
{47B2D651-8EE0-4C05-B451-F2DA264DD5B3} = {E5732454-7455-4078-88A2-E727DCC64D26}
|
||||
{5D6D28A7-1CD8-4C30-A0E4-1F8ACF389A29} = {E5732454-7455-4078-88A2-E727DCC64D26}
|
||||
{A3A703CC-F22E-40CE-9064-6DF3E55DD556} = {90E88965-DB90-4B49-94F5-6D2965491988}
|
||||
{E5732454-7455-4078-88A2-E727DCC64D26} = {90E88965-DB90-4B49-94F5-6D2965491988}
|
||||
{4FA9B783-ADAE-46F6-9AAD-ED32F1839F13} = {90E88965-DB90-4B49-94F5-6D2965491988}
|
||||
{99D97BD4-3F51-48BC-8BD2-647F6D268BB0} = {90E88965-DB90-4B49-94F5-6D2965491988}
|
||||
{826716DC-65C2-456A-BB6D-5FDEC423E4E6} = {4FA9B783-ADAE-46F6-9AAD-ED32F1839F13}
|
||||
{FE91B979-FE45-43F3-B9C4-430F2360FDDF} = {99D97BD4-3F51-48BC-8BD2-647F6D268BB0}
|
||||
{C8792BC7-33C0-41D4-97F6-684AD4B0B6A5} = {99D97BD4-3F51-48BC-8BD2-647F6D268BB0}
|
||||
{123F532B-4178-4D03-A4EE-2A8F3E01433F} = {99D97BD4-3F51-48BC-8BD2-647F6D268BB0}
|
||||
{B1131172-0748-4003-83ED-71574FD6331A} = {6AF591CA-B0C4-425B-9293-9E62F5BE9B3D}
|
||||
{125FB003-F154-425F-AD3F-A1D92977D353} = {CE475939-6363-4144-B18F-2F91CC297E91}
|
||||
{1BD19276-7DEF-4659-9DBF-28E8E5078698} = {CE475939-6363-4144-B18F-2F91CC297E91}
|
||||
{06360884-9EEC-49E3-8787-BE593D08AE44} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
|
||||
{D0CB210C-67BD-4F8D-9AD6-D6ABEF845CE7} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
|
||||
{20629279-8E17-49D2-9A30-352972F4F699} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
|
||||
{09343C10-49B7-43F7-BEA3-F4F51BFC767C} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
|
||||
{2AEAE82F-C690-4F19-BD60-03BA717EA350} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
|
||||
{1C2D25C2-4CF5-439E-9672-BE8750F15CCA} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
|
||||
{124CB400-9E02-44CC-A8ED-56CBED8B52B6} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
|
||||
{79C8C554-451D-4D5D-9E4C-AB7E4174568C} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
|
||||
{CE9BD09A-730F-4BB0-B1B0-FA692B6DD1C7} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
|
||||
{085B609C-083F-4698-9508-563CD6A8E71D} = {A5828819-62AB-4B03-A083-8B6ED4915AA3}
|
||||
{4D8D93B0-1B94-4FF7-BC36-B22AF3AEA41A} = {A5828819-62AB-4B03-A083-8B6ED4915AA3}
|
||||
{CABDF6AC-7AE0-445D-A4BE-BC9CD0B59AA5} = {A5828819-62AB-4B03-A083-8B6ED4915AA3}
|
||||
{A36BA15F-11FF-41E3-B488-7D84152C4CE9} = {A5828819-62AB-4B03-A083-8B6ED4915AA3}
|
||||
{E959F339-B52B-44A1-85EC-D5FB384255E5} = {A5828819-62AB-4B03-A083-8B6ED4915AA3}
|
||||
{861E33DB-C9C0-4C40-9042-75F7740F6DED} = {A5828819-62AB-4B03-A083-8B6ED4915AA3}
|
||||
{8DED0728-D54E-4A1E-B1D1-3740EC04ABAA} = {A5828819-62AB-4B03-A083-8B6ED4915AA3}
|
||||
{AC034643-EC5B-4BCD-BD1A-007FC3C50DF4} = {5541B406-4A9A-4AC8-AA77-CE14E133DB80}
|
||||
{521D4676-8E8A-4A4C-9835-B09FF4AFFBBC} = {A5828819-62AB-4B03-A083-8B6ED4915AA3}
|
||||
{407BE171-FB57-4C39-BF26-7FAF4450635F} = {CE475939-6363-4144-B18F-2F91CC297E91}
|
||||
{09F4FC1E-88A6-4264-9871-C0AF59DEA89D} = {46259E8D-32A4-4065-953D-D6F835B57A28}
|
||||
{BAEF69C3-9347-424D-B2B4-74BD2B3C90F9} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
|
||||
{02B5BE74-E75D-4573-B640-58DF2B01B4E9} = {1BD19276-7DEF-4659-9DBF-28E8E5078698}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {567F588F-E95C-4286-8B30-DB3B2200221C}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -0,0 +1 @@
|
||||
dotnet publish "..\src\BD.WTTS.Client.AppHost\BD.WTTS.Client.AppHost.csproj" -f net7.0 -c Release -p:PublishProfile=linux-x64 -p:DeployOnBuild=true --nologo
|
||||
@@ -0,0 +1,69 @@
|
||||
<h1 align="center">⬇️ Download Guide</h1>
|
||||
<div align="center">
|
||||
|
||||
English | [Simplified Chinese](./download-guide.md)
|
||||
|
||||
</div>
|
||||
|
||||
## Windows
|
||||
- Store version
|
||||
- Install in Microsoft Store
|
||||
- User data will be stored in ```%USERPROFILE%\AppData\Local\Packages\4651ED44255E.47979655102CE_k6txddmbb6c52\LocalState```
|
||||
- Portable version
|
||||
- The compressed package can be decompressed to any folder and cannot be run in the compressed software
|
||||
- User data will be stored in the program root directory ```\AppData```
|
||||
- With a file extension of 7z, for example ```Steam++_win_x64_v3.0.0.7z```.
|
||||
- Installation version
|
||||
- The installation package currently only supports Simplified Chinese
|
||||
- The installer will write software information in the registry
|
||||
- User data will be stored in ```%LocalAppData%\Steam++```
|
||||
- With a file extension of exe, for example ```Steam++_win_x64_v3.0.0.exe```.
|
||||
- 64-bit applications (recommended)
|
||||
- For 64-bit operating systems only, [Determine whether your computer is running a 32-bit ersionor 64-bit version of the Windows operating system](https://support.microsoft.com/n-us/topic/etermine-whether-your-computer-is-running-a-32-bit-version-or-64-bit-version-f-the-windows-perating-system-1b03ca69-ac5e-4b04-827b-c0c47145944b).
|
||||
- The file name **contains** x64, such as ```Steam++_win_x64_v3.0.0.7z```.
|
||||
- 32-bit application
|
||||
- For 32-bit or 64-bit operating systems.
|
||||
- The file name **contains** x86, such as ```Steam++_win_x86_v3.0.0.7z```.
|
||||
- ~~ARM64 application~~(Adapting…)
|
||||
- It is applicable to devices that use Arm64 CPU, such as **Microsoft Surface Pro X/Surface ro 95G** and other devices that use Qualcomm Snapdragon and MediaTek mobile processors.
|
||||
- The file name **contains** arm64, such as ```Steam++_win_arm64_v3.0.0.7z```.
|
||||
- Independent application ([SCD](https://learn.microsoft.com/en-us/dotnet/core/deploying/publish-elf-contained)) will include. NET runtime in the application. Users of this pplication do not eed to install. NET before running the application. (Recommended)
|
||||
- The file name **does not contains** fde, such as ```Steam++_win_x64_v3.0.0.7z```.
|
||||
- Framework-dependent application ([FDE](https://learn.microsoft.com/en-us/dotnet/core/eploying/publish-framework-dependent)), the application does not contain the. NET runtime nd library, but nly the application and third-party dependencies.
|
||||
- The file name **contains** fde, such as ```Steam++_win_x64_fde_v3.0.0.7z```.
|
||||
- Compared with independent applications, framework-dependent applications can reduce the disk space occupied by this application because of sharing the runtime, and the runtime can be repaired by Windows Update with security patches.
|
||||
- The following runtime needs to be installed
|
||||
- ASP.NET Runtime 7.x
|
||||
- ASP.NET Core Runtime 7.x
|
||||
- This application does not require IIS support. You can only install the relevant ntime instead of the Hosting Bundle.
|
||||
## macOS
|
||||
- ARM64 application
|
||||
- Applicable to Mac using ARM64 (Apple Silicon) chip, such as **Apple M1/M2**.
|
||||
- The file name **contains** arm64, such as ```Steam++_macos_arm64_v3.0.0.dmg```.
|
||||
- 64-bit applications
|
||||
- For Mac using Intel's x64 (x86-64) chip.
|
||||
- The file name **contains** x64, such as ```Steam++_macos_x64_v3.0.0.dmg```.
|
||||
- ~~General package~~(Adapting…)
|
||||
- All versions of binaries are included in this package and are applicable to all supported evices, but the file size is large.
|
||||
## Linux
|
||||
- 64-bit applications
|
||||
- Applicable to devices using Intel and AMD's x64 (x86-64) chips.
|
||||
- The file name **contains** x64, such as ```Steam++_linux_x64_v3.0.0.tar.zst```.
|
||||
- ARM64 application
|
||||
- Applicable to devices using ARM64 chips, such as **Raspberry Pi Model 3+**.
|
||||
- The file name **contains** x64, such as ```Steam++_linux_arm64_v3.0.0.tar.zst```.
|
||||
## Android
|
||||
- General package (recommended)
|
||||
- All versions of binaries are included in this package and are applicable to all supported vices, but the file size is large.
|
||||
- The file name **only contains** android, such as ```Steam++_android_v3.0.0.apk```.
|
||||
- ~~arm64-v8a~~(Deprecated…)
|
||||
- Applicable to the use of current mainstream mobile phones or tablet devices
|
||||
- The file name **contains** arm64-v8a, such as ```Steam++_arm64-v8a_v3.0.0.apk```.
|
||||
- ~~armeabi-v7a~~(Deprecated…)
|
||||
- It is applicable to the use of old mobile phones or tablet devices, usually those roducedbefore the second half of **2014**.
|
||||
- The file name **contains** armeabi_v7a, such as ```Steam++_armeabi_v7a_v3.0.0.apk```.
|
||||
- ~~x86_64~~(Deprecated…)
|
||||
- Applicable to devices using Intel and AMD's x64 (x86-64) chips, such as simulators on PC.
|
||||
- The file name **contains** x64, such as ```Steam++_x64_v3.0.0.apk```.
|
||||
## ~~iOS/iPadOS~~(In development…) <img src="../res/brands/apple.svg" width="16" height="16" />
|
||||
- Download in App Store
|
||||
@@ -0,0 +1,77 @@
|
||||
<h1 align="center">⬇️ 下载指南</h1>
|
||||
<div align="center">
|
||||
|
||||
[English](./download-guide.en.md) | 简体中文
|
||||
|
||||
</div>
|
||||
|
||||
## Windows
|
||||
- 应用商店版
|
||||
- 在 Microsoft 应用商店中安装
|
||||
- 用户数据将存放于 ```%USERPROFILE%\AppData\Local\Packages\4651ED44255E.47979655102CE_k6txddmbb6c52\LocalState```
|
||||
- 便携版
|
||||
- 压缩包解压到任意文件夹即可,不可在压缩软件中运行
|
||||
- 用户数据将存放于程序根目录下 ```\AppData```
|
||||
- 文件扩展名为 7z 的,例如 ```Steam++_win_x64_v3.0.0.7z```。
|
||||
- 安装版
|
||||
- 安装包当前仅支持简体中文
|
||||
- 安装程序将会在注册表中写入软件信息
|
||||
- 用户数据将存放于 ```%LocalAppData%\Steam++```
|
||||
- 文件扩展名为 exe 的,例如 ```Steam++_win_x64_v3.0.0.exe```。
|
||||
- 64 位应用程序(推荐)
|
||||
- 仅适用于 64 位操作系统,[确定您的计算机运行的是 32 位版本还是 64 位版本的 Windows 操作系统](https://pport.microsoft.com/zh-cn/topic/%E7%A1%AE%E5%AE%9A%E6%82%A8%E7%9A%84%E8%AE%1%E7%AE%97%6%9C%BAE8%BF%90%E8%A1%8C%E7%9A%84%E6%98%AF-32-%E4%BD%8D%E7%89%88%E6%9C%C%E8%BF%98%E6%98%F-64-%E4%BD%D%E7%89%88%E6%9C%AC%E7%9A%84-windows-%E6%93%8D%E4%BD%C%E7%B3%BB%E7%BB%F-1b03ca69-c5e-4b04-827b-c0c47145944b)。
|
||||
- 文件名中**包含** x64 的,例如 ```Steam++_win_x64_v3.0.0.exe```。
|
||||
- 32 位应用程序
|
||||
- 适用于 32 位或 64 位操作系统。
|
||||
- 文件名中**包含** x86 的,例如 ```Steam++_win_x86_v3.0.0.exe```。
|
||||
- ~~ARM64 应用程序~~(适配中…)
|
||||
- 适用于使用 Arm64 CPU 的设备,例如 **微软 Surface Pro X/Surface Pro 9 5G** 等使用高通骁龙、联发科动处理的设备。
|
||||
- 文件名中**包含** arm64 的,例如 ```Steam++_win_arm64_v3.0.0.exe```。
|
||||
- 独立应用([SCD](https://learn.microsoft.com/zh-cn/dotnet/core/deploying/#publish-self-ontained)),会应用中包含 .NET 运行时,该应用的用户无需在运行应用前安装 .NET。 (推荐)
|
||||
- 文件名中**不包含** fde 的,例如 ```Steam++_win_x64_v3.0.0.exe```。
|
||||
- 依赖于框架的应用([FDE](https://learn.microsoft.com/zh-cn/dotnet/core/deploying/#publish-ramework-ependent)),则该应用不包含 .NET 运行时和库,而仅包含该应用和第三方依赖项。
|
||||
- 文件名中**包含** fde 的,例如 ```Steam++_win_x64_fde_v3.0.0.exe```。
|
||||
- 依赖于框架的应用相比独立应用因共享运行时,可减少本应用占用的磁盘空间,且运行时可由 Windows 更新进行安全补丁修复。
|
||||
- 需要安装以下运行时
|
||||
- ASP.NET 运行时 7.x
|
||||
- ASP.NET Core 运行时 7.x
|
||||
- 此应用不需要 IIS 支持,可仅安装相关运行时而不是托管捆绑包。
|
||||
## macOS
|
||||
- ARM64 应用程序
|
||||
- 适用于使用 ARM64(Apple Silicon) 芯片的 Mac,例如 **Apple M1/M2**。
|
||||
- 文件名中**包含** x64 的,例如 ```Steam++_macos_arm64_v3.0.0.dmg```。
|
||||
- 64 位应用程序
|
||||
- 适用于使用 Intel 的 x64(x86-64) 芯片的 Mac。
|
||||
- 文件名中**包含** x64 的,例如 ```Steam++_macos_x64_v3.0.0.dmg```。
|
||||
- ~~通用包~~(适配中…)
|
||||
- 所有版本的二进制文件都包含在此包中,适用于所有支持的设备,但文件体积较大。
|
||||
## Linux
|
||||
- 64 位应用程序
|
||||
- 适用于使用 Intel、AMD 的 x64(x86-64) 芯片的设备。
|
||||
- 文件名中**包含** x64 的,例如 ```Steam++_linux_x64_v3.0.0.tar.zst```。
|
||||
- ARM64 应用程序
|
||||
- 适用于使用 ARM64 芯片的设备,例如 **Raspberry Pi Model 3+**。
|
||||
- 文件名中**包含** x64 的,例如 ```Steam++_linux_arm64_v3.0.0.tar.zst```。
|
||||
## Android
|
||||
- 通用包(推荐)
|
||||
- 所有版本的二进制文件都包含在此包中,适用于所有支持的设备,但文件体积较大。
|
||||
- 文件名中**仅包含** android 的,例如 ```Steam++_android_v3.0.0.apk```。
|
||||
- ~~arm64-v8a~~(已弃用…)
|
||||
- 适用于使用目前主流的手机或平板设备
|
||||
- 文件名中**包含** arm64_v8a 的,例如 ```Steam++_android_arm64_v8a_v3.0.0.apk```。
|
||||
- ~~armeabi-v7a~~(已弃用…)
|
||||
- 适用于使用老旧的手机或平板设备,通常为 **2014** 年下半年之前生产的设备。
|
||||
- 文件名中**包含** armeabi_v7a 的,例如 ```Steam++_android_armeabi_v7a_v3.0.0.apk```。
|
||||
- ~~x86_64~~(已弃用…)
|
||||
- 适用于使用 Intel、AMD 的 x64(x86-64) 芯片的设备,例如 PC 上的模拟器。
|
||||
- 文件名中**包含** x64 的,例如 ```Steam++_android_x64_v3.0.0.apk```。
|
||||
## ~~iOS/iPadOS~~(开发中…) <img src="../res/brands/apple.svg" width="16" height="16" />
|
||||
- 在 App Store 中下载
|
||||
|
||||
<!--
|
||||
TODO: new fileName
|
||||
Steam++_win_x64_v3.0.0.exe
|
||||
Steam++_win_x64_v3.0.0.7z
|
||||
Steam++_win_x64_with_runtime_v3.0.0.exe
|
||||
Steam++_win_x64_with_runtime_v3.0.0.7z
|
||||
-->
|
||||
@@ -0,0 +1 @@
|
||||
### [OpenWrt](https://openwrt.org/start)
|
||||
@@ -0,0 +1,152 @@
|
||||
# 前言
|
||||
|
||||
Steam++是一款开源的跨平台Steam工具箱,请不要在非官方渠道下载软件,
|
||||
[官网](https://www.steampp.net),大家可以去官网或者开源仓库地址下载。
|
||||
|
||||
# Steam++工具箱
|
||||
|
||||
|
||||
## 2.6.2更新内容
|
||||
微软商店版本在微软商店检查获取更新即可,一般会比桌面版晚上一天的审核时间。
|
||||
### 版本亮点
|
||||
1. ASF 升级至 **V5.2.0.10**
|
||||
2. 新增 ASF 控制台字体大小、最大行数设置项
|
||||
3. 新增 Steam 下载完成定时关机、睡眠功能
|
||||
4. 新增 代理设置可自定义 DNS
|
||||
5. 新增 ASF 编辑/移除 Bot 功能
|
||||
6. 新增 Microsoft/Xbox 相关加速服务 (需要升级到 **2.6.2** 之后可用)
|
||||
7. 新增 Uplay 相关加速服务 (需要升级到 **2.6.2** 之后可用)
|
||||
8. 新增 OneDrive 等更多相关加速服务 (需要升级到 **2.6.2** 之后可用)
|
||||
9. 优化 Desktop 加速代理性能
|
||||
10. 优化 Desktop 脚本注入打包的性能
|
||||
11. 优化 Desktop 已安装游戏加载性能
|
||||
12. 从此版本开始将使用 Github Action 自动化部署发布
|
||||
|
||||
### 修复问题
|
||||
1. 改进 Desktop 网络加速现默认使用阿里 DNS(223.5.5.5, 223.6.6.6)
|
||||
2. 改进 自动更新包文件校验失败时提示
|
||||
3. 改进 自动更新失败时将自动跳转官网
|
||||
4. 改进 ASF IPC 默认端口号由 1242 改为 6242
|
||||
5. 修复 Linux 与 macOS 中 ASF-UI 解压包文件夹分隔符不正确
|
||||
6. 修复 Windows Hosts 只读时尝试取消只读属性的操作没有正确执行
|
||||
7. 修复 Windows 此软件自动更新删除更新包缓存时因文件占用引发的中断
|
||||
8. 修复 Desktop 高 DPI 下动态桌面错位
|
||||
9. 修复 本地令牌确认交易在登录时可能会卡住
|
||||
10. 修复 Windows 启用动态桌面后全屏可能导致窗口冻结无法操作
|
||||
11. 修复 Windows 动态背景有时会被其他窗口遮挡
|
||||
12. 改进 本地令牌 登录验证码无法加载时可点击在浏览器中查看验证码图片
|
||||
13. 修复 Desktop 加速代理中可能出现的一些错误
|
||||
14. 改进 Desktop 令牌详情 UI
|
||||
15. 改进 Desktop 账号切换中的用户名信息现在默认隐藏
|
||||
16. 改进 Desktop 深色模式与浅色模式的视觉效果
|
||||
17. 修复 Pixiv 加速不能登录的问题
|
||||
18. 修复 Twitch 加速不计算掉宝进度的问题
|
||||
19. 修复 Discord 加速检测更新失败导致无法启动客户端的问题
|
||||
20. 修复 Windows 因添加 JumpList 时可能导致的闪退
|
||||
21. 修复 Desktop 本地令牌 点击锁定后输入密码按回车解锁会循环无限触发锁定的问题
|
||||
|
||||
|
||||
[](https://steampp.net)
|
||||
[]()
|
||||
|
||||
------
|
||||
|
||||
|
||||
## 工具介绍
|
||||
|
||||
`Steam++`是一款开源的跨平台Steam工具箱,所有本地功能完全免费,开源发布于Github,如果您对发布的二进制文件不放心,可以自行下载源码编译运行。
|
||||
此工具的大部分功能都是需要您下载安装Steam才能使用。
|
||||
工具预计将整合进大部分常用的Steam相关工具,并且尽力做到比原工具更好用。
|
||||
软件截图
|
||||
[hide]
|
||||
[attachimg]1463881[/attachimg]
|
||||
[attachimg]1463882[/attachimg]
|
||||
[attachimg]1463884[/attachimg]
|
||||
[attachimg]1463899[/attachimg]
|
||||
[/hide]
|
||||
|
||||
## 核心功能
|
||||
|
||||
|
||||
### 1. 通过本地反代理Steam的社区等网页使其能正常访问
|
||||
|
||||
功能使用Titanium-Web-Proxy开源项目进行本地反代,相比SteamCommunity302工具具有更快的启动速度。让用户能够连接上诸如Steam社区(个人资料页)、Discord语音聊天、Twitch直播观看、Origin下载加速、谷歌验证码、Pixiv图片等。
|
||||
|
||||
### 2. 快速切换当前PC已经记住登陆的Steam账号
|
||||
|
||||
该功能是读取Steam路径下存储的本地用户登录记录直接展示操作,可以多账号切换无需重新输入密码和令牌。如果您的ip地址更换,会导致登陆状态失效。
|
||||
|
||||
### 3. Steam游戏成就管理
|
||||
|
||||
能够读取任何游戏的成就信息(包括隐藏成就),并且能进行成就修改,包括成就解锁以及成就反解锁,还能够修改成就统计信息
|
||||
参考SAM(SteamAchievementManager)进行二次开发,修复了成就语言有中文却依然是英文成就信息的BUG,修改了游戏列表的加载和操作易用性。
|
||||
注意:滥用成就管理功能可能会导致开发者封禁!
|
||||
[attachimg]1463887[/attachimg]
|
||||
|
||||
### 4. Steam本地两步身份验证器
|
||||
|
||||
该功能能够将Steam手机令牌储存到您的电脑中,并能够进行与手机端一样的操作。
|
||||
不仅能查看手机令牌,还能进行交易报价确认,并且能一键全部确认。
|
||||
功能参考WinAuth开发,功能类似的软件有WinAuth、SteamDesktopAuthenticator。
|
||||
本地令牌交易市场报价确认
|
||||
[attachimg]1463890[/attachimg]
|
||||
|
||||
### 5. Steam内置浏览器脚本注入
|
||||
|
||||
通过反代加速功能将js脚本内置插入了Steam客户端内的浏览器,达到了与油猴类似的效果。目前2.0.0.6版本新增了脚本工坊,可以从我们的服务器上下载到已经兼容的脚本。我们也会不断添加新的脚本,同时也会对旧的脚本进行维护。
|
||||
[attachimg]1463883[/attachimg]
|
||||
|
||||
### 6.Steam家庭库共享排序
|
||||
|
||||
可以排序你的共享库存顺序,避免只能读取A的共享游戏,却想玩B的共享游戏。
|
||||
|
||||
### 7.Steam监控下载完成定时关机
|
||||
|
||||
可以监控Steam下载列表所有游戏的下载进度并设置下载完成后自动关机或睡眠电脑,节约你的电费。
|
||||
|
||||
### 8.已内置ASF挂卡功能
|
||||
|
||||
[ASF](https://github.com/JustArchiNET/ArchiSteamFarm)大家肯定都不陌生,它实在是太好用了,所以我们内置了ASF在Steam++内,并在后续会对ASF在UI环境下使用做更多增强体验。
|
||||
|
||||
### 10. 更多的游戏工具功能
|
||||
|
||||
支持各种老游戏无边框窗口化等等
|
||||
|
||||
#### 并且,以上功能全部免费。
|
||||
|
||||
Linux 截图:
|
||||
[attachimg]1463884[/attachimg]
|
||||
|
||||
------
|
||||
|
||||
|
||||
## 运行环境
|
||||
|
||||
> 程序使用C# 在 .NET 6.0环境下开发,新版采用独立部署编译,不需要运行环境也可以运行)。
|
||||
|
||||
RuntimeIdentifier | Available | Edition
|
||||
--- | --- | ---
|
||||
win-x64 | ✅ | Stable
|
||||
osx-x64 | ✅ | β
|
||||
linux-x64 | ✅ | α
|
||||
android-arm64 | ✅ | α
|
||||
android-arm | ✅ | α
|
||||
linux-arm64 | ✅ | α
|
||||
linux-arm | ✅ | α
|
||||
osx-arm64 | ❌ |
|
||||
win-arm64 | ❌ |
|
||||
ios-arm64 | ❌ |
|
||||
|
||||
|
||||
## 下载
|
||||
|
||||
> [官网](https://steampp.net/)
|
||||
> [Github](https://github.com/rmbadmin/SteamTools/releases)
|
||||
> [Gitee](https://gitee.com/rmbgame/SteamTools/releases)
|
||||
> [Microsoft Store](https://www.microsoft.com/store/productId/9MTCFHS560NG)
|
||||
> 分流下载:
|
||||
> [hide]
|
||||
> [蓝奏云](https://cliencer.lanzoux.com/b0165duja)
|
||||
> 提取码:1234
|
||||
> [/hide]
|
||||
> 使用过程中可能遇到windows defender误报,您可以选择添加信任。
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"msbuild-sdks": {
|
||||
"MSBuild.Sdk.Extras": "3.0.22"
|
||||
},
|
||||
"sdk": {
|
||||
"version": "6.0.100-preview.4.21255.9"
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<packageSources>
|
||||
<add key="dotnet-experimental" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-experimental/nuget/v3/index.json" />
|
||||
<add key="AvaloniaCI" value="https://nuget.avaloniaui.net/repository/avalonia-all/index.json" />
|
||||
</packageSources>
|
||||
</configuration>
|
||||
@@ -1 +0,0 @@
|
||||
dotnet publish ..\source\SteamTools -c Release -f net5.0-windows -r win-x86 - /p:PublishSingleFile=true /p:PublishTrimmed=true -o out/result
|
||||
@@ -1,318 +0,0 @@
|
||||
function Main
|
||||
{
|
||||
begin
|
||||
{
|
||||
$ErrorActionPreference = 'stop'
|
||||
|
||||
$target = 'net472'
|
||||
$result = 'Steam++'
|
||||
$bin = '..\source\SteamTools\bin\x86\Release\'
|
||||
# '*.exe.config'
|
||||
$targetKeywords = '*.exe','*.dll','*.txt','*.VisualElementsManifest.xml','*.pak','*.bin','*.js','Log4net.config'
|
||||
$ignoreKeywords = '*.vshost.*','Microsoft.*.resources.dll','ExPlugin.*.dll'
|
||||
|
||||
$exeSource = '\Steam++.exe'
|
||||
|
||||
if (-not(Test-Path $bin))
|
||||
{
|
||||
throw 'Script detected as locate in invalid path exception!! Make sure exist in <SteamTools repository root>\tools-release\'
|
||||
}
|
||||
}
|
||||
|
||||
end
|
||||
{
|
||||
try
|
||||
{
|
||||
# clean up current
|
||||
Get-ChildItem -Directory | Remove-item -Recurse
|
||||
Get-ChildItem | where { $_.Extension -eq ".zip" } | Remove-Item
|
||||
|
||||
Copy-StrictedFilterFileWithDirectoryStructure -Path $(Join-Path $bin $target) -Destination '.\' -Targets $targetKeywords -Exclude $ignoreKeywords
|
||||
|
||||
# valid path check
|
||||
$versionSource = Join-Path $target $exeSource -Resolve
|
||||
|
||||
if ((Test-Path $versionSource) -and (Test-Path $target))
|
||||
{
|
||||
$version = (Get-ChildItem $versionSource).VersionInfo
|
||||
$result = $result + ' v{0}.{1}.{2}' -f $version.ProductMajorPart, $version.ProductMinorPart,$version.ProductBuildPart
|
||||
|
||||
Rename-Item -NewName $result -Path $target
|
||||
New-ZipCompression -source $(Join-Path $(Get-Location) $result) -destination $(Join-Path $(Get-Location).Path ('./' + $result + '.zip'))
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
throw $_
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# https://gist.github.com/guitarrapc/e78bbd4ddc07389e17d6
|
||||
function Copy-StrictedFilterFileWithDirectoryStructure
|
||||
{
|
||||
[CmdletBinding()]
|
||||
param
|
||||
(
|
||||
[parameter(
|
||||
mandatory = 1,
|
||||
position = 0,
|
||||
ValueFromPipeline = 1,
|
||||
ValueFromPipelineByPropertyName = 1)]
|
||||
[string]
|
||||
$Path,
|
||||
|
||||
[parameter(
|
||||
mandatory = 1,
|
||||
position = 1,
|
||||
ValueFromPipelineByPropertyName = 1)]
|
||||
[string]
|
||||
$Destination,
|
||||
|
||||
[parameter(
|
||||
mandatory = 1,
|
||||
position = 2,
|
||||
ValueFromPipelineByPropertyName = 1)]
|
||||
[string[]]
|
||||
$Targets,
|
||||
|
||||
[parameter(
|
||||
mandatory = 0,
|
||||
position = 3,
|
||||
ValueFromPipelineByPropertyName = 1)]
|
||||
[string[]]
|
||||
$Excludes
|
||||
)
|
||||
|
||||
begin
|
||||
{
|
||||
$list = New-Object 'System.Collections.Generic.List[String]'
|
||||
}
|
||||
|
||||
process
|
||||
{
|
||||
Foreach ($target in $Targets)
|
||||
{
|
||||
# Copy "All Directory Structure" and "File" which Extension type is $ex
|
||||
Copy-Item -Path $Path -Destination $Destination -Force -Recurse -Filter $target
|
||||
}
|
||||
}
|
||||
|
||||
end
|
||||
{
|
||||
# Remove -Exclude Item
|
||||
Foreach ($exclude in $Excludes)
|
||||
{
|
||||
Get-ChildItem -Path $Destination -Recurse -File | where Name -like $exclude | Remove-Item
|
||||
}
|
||||
|
||||
# search Folder which include file
|
||||
$allFolder = Get-ChildItem $Destination -Recurse -Directory
|
||||
$containsFile = $allFolder | where {$_.GetFiles()}
|
||||
$containsFile.FullName `
|
||||
| %{
|
||||
$fileContains = $_
|
||||
$result = $allFolder.FullName `
|
||||
| where {$_ -notin $list} `
|
||||
| where {
|
||||
$shortPath = $_
|
||||
$fileContains -like "$shortPath*"
|
||||
}
|
||||
$result | %{$list.Add($_)}
|
||||
}
|
||||
$folderToKeep = $list | sort -Unique
|
||||
|
||||
# Remove All Empty (none file exist) folders
|
||||
Get-ChildItem -Path $Destination -Recurse -Directory | where fullName -notin $folderToKeep | Remove-Item -Recurse
|
||||
}
|
||||
}
|
||||
|
||||
# http://tech.guitarrapc.com/entry/2013/10/08/040325
|
||||
function New-ZipCompression
|
||||
{
|
||||
[CmdletBinding()]
|
||||
param
|
||||
(
|
||||
[parameter(
|
||||
mandatory,
|
||||
position = 0,
|
||||
valuefrompipeline,
|
||||
valuefrompipelinebypropertyname)]
|
||||
[string]
|
||||
$source,
|
||||
|
||||
[parameter(
|
||||
mandatory = 0,
|
||||
position = 1,
|
||||
valuefrompipeline,
|
||||
valuefrompipelinebypropertyname)]
|
||||
[string]
|
||||
$destination,
|
||||
|
||||
[parameter(
|
||||
mandatory = 0,
|
||||
position = 2)]
|
||||
[switch]
|
||||
$quiet,
|
||||
|
||||
[parameter(
|
||||
mandatory = 0,
|
||||
position = 3)]
|
||||
[switch]
|
||||
$force
|
||||
)
|
||||
|
||||
try
|
||||
{
|
||||
Add-Type -AssemblyName 'System.IO.Compression.FileSystem'
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
|
||||
# check file is directory
|
||||
$file = Get-Item -Path $source
|
||||
|
||||
# set zip extension
|
||||
$zipExtension = '.zip'
|
||||
|
||||
# set desktop as destination path if it null
|
||||
if ([string]::IsNullOrWhiteSpace($destination))
|
||||
{
|
||||
if ($file.Mode -like 'd*')
|
||||
{
|
||||
$destination = (Join-Path ([System.Environment]::GetFolderPath([Environment+SpecialFolder]::Desktop)) [System.IO.Path]::GetFileNameWithoutExtension($source + $zipExtension))
|
||||
}
|
||||
else
|
||||
{
|
||||
$destination = (Join-Path ([System.Environment]::GetFolderPath([Environment+SpecialFolder]::Desktop)) [System.IO.Path]::GetFileNameWithoutExtension(($file | select -First 1 -ExpandProperty fullname))) + $zipExtension
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
# check destination is input as .zip
|
||||
if (-not($destination.EndsWith($zipExtension)))
|
||||
{
|
||||
throw ('destination parameter value [{0}] not end with extension {1}' -f $destination, $zipExtension)
|
||||
}
|
||||
|
||||
# check destination is already exist or not
|
||||
if (Test-Path $destination)
|
||||
{
|
||||
Remove-Item -Path $destination -Confirm
|
||||
}
|
||||
|
||||
|
||||
# compressionLevel
|
||||
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
|
||||
|
||||
# check file mode for source
|
||||
Write-Verbose ('file.mode = {0}' -f $file.Mode)
|
||||
|
||||
if ($file.Mode -like 'd*') # Directory should be d---
|
||||
{
|
||||
try # create zip from directory
|
||||
{
|
||||
# force output zip file to new destination path, avoiding destination zip name conflict.
|
||||
if ($force)
|
||||
{
|
||||
# check destination is already exist, CreateFromDirectory will fail with same name of destination file.
|
||||
if (Test-Path $destination)
|
||||
{
|
||||
# show warning for same destination exist.
|
||||
Write-Verbose ('Detected destination name {0} is already exist. Force trying output to new destination zip name.' -f $destination)
|
||||
|
||||
# get current destination information
|
||||
$destinationRoot = [System.IO.Path]::GetDirectoryName($destination)
|
||||
$destinationfile = [System.IO.Path]::GetFileNameWithoutExtension($destination)
|
||||
$destinationExtension = [System.IO.Path]::GetExtension($destination)
|
||||
|
||||
# renew destination name with (2)...(x) until no more same name catch.
|
||||
$count = 2
|
||||
$destination = Join-Path $destinationRoot ($destinationfile + '(' + $count + ')' + $destinationExtension)
|
||||
while (Test-Path $destination)
|
||||
{
|
||||
++$count
|
||||
$destination = Join-Path $destinationRoot ($destinationfile + '(' + $count + ')' + $destinationExtension)
|
||||
}
|
||||
|
||||
# show warning as destination name had been changed due to escape error.
|
||||
Write-Verbose ('Deistination name change to new name {0}' -f $destination)
|
||||
}
|
||||
}
|
||||
|
||||
# include BaseDirectory
|
||||
$includeBaseDirectory = $true
|
||||
|
||||
Write-Verbose ('destination = {0}' -f $destination)
|
||||
|
||||
Write-Verbose ('file.fullname = {0}' -f $file.FullName)
|
||||
Write-Verbose ('compressionLevel = {0}' -f $compressionLevel)
|
||||
Write-Verbose ('includeBaseDirectory = {0}' -f $includeBaseDirectory)
|
||||
|
||||
if ($quiet)
|
||||
{
|
||||
Write-Verbose ('zipping up folder {0} to {1}' -f $file.FullName,$destination)
|
||||
[System.IO.Compression.ZipFile]::CreateFromDirectory($file.fullname,$destination,$compressionLevel,$includeBaseDirectory) > $null
|
||||
$?
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Verbose ('zipping up folder {0} to {1}' -f $file.FullName,$destination)
|
||||
[System.IO.Compression.ZipFile]::CreateFromDirectory($file.fullname,$destination,$compressionLevel,$includeBaseDirectory)
|
||||
Get-Item $destination
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
Write-Error $_
|
||||
$?
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
try # create zip from files
|
||||
{
|
||||
# create zip to add
|
||||
$destzip = [System.IO.Compression.Zipfile]::Open($destination,'Update')
|
||||
|
||||
# get items
|
||||
$files = Get-ChildItem -Path $source
|
||||
|
||||
foreach ($file in $files)
|
||||
{
|
||||
$file2 = $file.name
|
||||
|
||||
Write-Verbose ('destzip = {0}' -f $destzip)
|
||||
Write-Verbose ('file.fullname = {0}' -f $file.FullName)
|
||||
Write-Verbose ('file2 = {0}' -f $file2)
|
||||
Write-Verbose ('compressionLevel = {0}' -f $compressionLevel)
|
||||
|
||||
if ($quiet)
|
||||
{
|
||||
Write-Verbose ('zipping up files {0} to {1}' -f $file.FullName,$destzip)
|
||||
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($destzip,$file.fullname,$file2,$compressionLevel) > $null
|
||||
$?
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Verbose ('zipping up files {0} to {1}' -f $file.FullName,$destzip)
|
||||
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($destzip,$file.fullname,$file2,$compressionLevel)
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
Write-Error $_
|
||||
$?
|
||||
}
|
||||
finally
|
||||
{
|
||||
# dispose opened zip
|
||||
$destzip.Dispose()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Main
|
||||
@@ -1,44 +0,0 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<!--<TargetFrameworks>netstandard2.0;netstandard2.1;net5.0</TargetFrameworks>-->
|
||||
<!--<TargetFrameworks Condition="'$(OS)' == 'Windows_NT'">$(TargetFrameworks);net461</TargetFrameworks>-->
|
||||
<TargetFramework>net5.0</TargetFramework>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
<!--<Configurations>Debug;Release;Nuget_Release</Configurations>-->
|
||||
<Description>.NET binding for the Chromium Embedded Framework (Avalonia control)</Description>
|
||||
<PackageTags>CefNet, CEF, browser, chromium, Avalonia, AvaloniaUI</PackageTags>
|
||||
<DefineConstants>AvaloniaBeta;$(DefineConstants)</DefineConstants>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<DefineConstants>$(DefineConstants);TRACE;AVALONIA</DefineConstants>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Remove="Internal\CursorInteropHelper.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Include="..\CefNet.Windows.Forms\WinApi\DWMWINDOWATTRIBUTE.cs" Link="WinApi\DWMWINDOWATTRIBUTE.cs" />
|
||||
<Compile Include="..\CefNet.Wpf\Events\PdfPrintFinishedRoutedEventArgs.cs" Link="Events\PdfPrintFinishedRoutedEventArgs.cs" />
|
||||
<Compile Include="..\CefNet.Wpf\Events\ScriptDialogOpeningRoutedEventArgs.cs" Link="Events\ScriptDialogOpeningRoutedEventArgs.cs" />
|
||||
<Compile Include="..\CefNet.Wpf\Events\TextFoundRoutedEventArgs.cs" Link="Events\TextFoundRoutedEventArgs.cs" />
|
||||
<Compile Include="..\CefNet\WebView.CommonImplementation.cs" Link="WebView.CommonImplementation.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Avalonia" Version="0.10.999-cibuild0013694-beta" />
|
||||
<PackageReference Include="CefNet" Version="90.5.21109.1453" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Condition=" Exists('$(MSBuildProjectDirectory)\..\..\..\src\Common.CoreLib\Properties\ThisAssembly.Version.cs') ">
|
||||
<Compile Include="..\..\..\src\Common.CoreLib\Properties\AssemblyInfo.Version.cs">
|
||||
<Link>Properties\AssemblyInfo.Version.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\..\..\src\Common.CoreLib\Properties\ThisAssembly.Version.cs">
|
||||
<Link>Properties\ThisAssembly.Version.cs</Link>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -1,167 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Controls.ApplicationLifetimes;
|
||||
using Avalonia.Interactivity;
|
||||
using Avalonia.Threading;
|
||||
|
||||
namespace CefNet
|
||||
{
|
||||
public class CefNetApplicationLifetime : IClassicDesktopStyleApplicationLifetime, IControlledApplicationLifetime, IApplicationLifetime, IDisposable
|
||||
{
|
||||
private int _exitCode;
|
||||
private CancellationTokenSource _cts;
|
||||
private bool _isShuttingDown;
|
||||
private HashSet<Window> _windows = new HashSet<Window>();
|
||||
private static CefNetApplicationLifetime _activeLifetime;
|
||||
|
||||
|
||||
/// <inheritdoc />
|
||||
public string[] Args { get; internal set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public ShutdownMode ShutdownMode { get; set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public Window MainWindow { get; set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public IReadOnlyList<Window> Windows
|
||||
{
|
||||
get { return _windows.ToList(); }
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public event EventHandler<ControlledApplicationLifetimeStartupEventArgs> Startup;
|
||||
|
||||
/// <inheritdoc />
|
||||
public event EventHandler<ControlledApplicationLifetimeExitEventArgs> Exit;
|
||||
|
||||
static CefNetApplicationLifetime()
|
||||
{
|
||||
Window.WindowOpenedEvent.AddClassHandler(typeof(Window), new EventHandler<RoutedEventArgs>(OnWindowOpened));
|
||||
Window.WindowClosedEvent.AddClassHandler(typeof(Window), new EventHandler<RoutedEventArgs>(WindowClosedEvent));
|
||||
}
|
||||
|
||||
private static void WindowClosedEvent(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var window = sender as Window;
|
||||
if (window is null)
|
||||
return;
|
||||
_activeLifetime?._windows.Remove(window);
|
||||
_activeLifetime?.HandleWindowClosed(window);
|
||||
}
|
||||
|
||||
private static void OnWindowOpened(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var window = sender as Window;
|
||||
if (window is null)
|
||||
return;
|
||||
_activeLifetime?._windows.Add(window);
|
||||
}
|
||||
|
||||
public CefNetApplicationLifetime()
|
||||
{
|
||||
if (_activeLifetime is null)
|
||||
_activeLifetime = this;
|
||||
else
|
||||
throw new InvalidOperationException($"Can not have multiple active {this.GetType().Name} instances and the previously created one was not disposed.");
|
||||
}
|
||||
|
||||
protected virtual void HandleWindowClosed(Window window)
|
||||
{
|
||||
if (window != null && !_isShuttingDown)
|
||||
{
|
||||
if (ShutdownMode == ShutdownMode.OnLastWindowClose && _windows.Count == 0)
|
||||
{
|
||||
Shutdown();
|
||||
}
|
||||
else if (ShutdownMode == ShutdownMode.OnMainWindowClose && window == MainWindow)
|
||||
{
|
||||
Shutdown();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Shutdown(int exitCode = 0)
|
||||
{
|
||||
if (_isShuttingDown)
|
||||
throw new InvalidOperationException("Application is already shutting down.");
|
||||
|
||||
_exitCode = exitCode;
|
||||
|
||||
_isShuttingDown = true;
|
||||
try
|
||||
{
|
||||
foreach (Window window in Windows)
|
||||
{
|
||||
window.Close();
|
||||
}
|
||||
CefNetApplication.Instance.SignalForShutdown(ShutdownComplete);
|
||||
}
|
||||
catch
|
||||
{
|
||||
ShutdownComplete();
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
private void ShutdownComplete()
|
||||
{
|
||||
_cts?.Cancel();
|
||||
_cts = null;
|
||||
_isShuttingDown = false;
|
||||
}
|
||||
|
||||
public int Start(string[] args)
|
||||
{
|
||||
try
|
||||
{
|
||||
this.Startup?.Invoke(this, new ControlledApplicationLifetimeStartupEventArgs(args));
|
||||
_cts = new CancellationTokenSource();
|
||||
MainWindow?.Show();
|
||||
|
||||
Dispatcher.UIThread.MainLoop(_cts.Token);
|
||||
|
||||
ControlledApplicationLifetimeExitEventArgs e = new ControlledApplicationLifetimeExitEventArgs(_exitCode);
|
||||
this.Exit?.Invoke(this, e);
|
||||
|
||||
Environment.ExitCode = e.ApplicationExitCode;
|
||||
return e.ApplicationExitCode;
|
||||
}
|
||||
finally
|
||||
{
|
||||
CefNetApplication.Instance.Shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (_activeLifetime == this)
|
||||
_activeLifetime = null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class CefNetApplicationLifetimeExtensions
|
||||
{
|
||||
public static int StartWithCefNetApplicationLifetime<T>(this T builder, string[] args, ShutdownMode shutdownMode = ShutdownMode.OnLastWindowClose)
|
||||
where T : AppBuilderBase<T>, new()
|
||||
{
|
||||
CefNetApplicationLifetime lifetime = new CefNetApplicationLifetime
|
||||
{
|
||||
Args = args,
|
||||
ShutdownMode = shutdownMode
|
||||
};
|
||||
builder.SetupWithLifetime(lifetime);
|
||||
return lifetime.Start(args);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -1,199 +0,0 @@
|
||||
using Avalonia.Input;
|
||||
using Avalonia.Interactivity;
|
||||
using Avalonia.Media;
|
||||
using CefNet.Input;
|
||||
using CefNet.Internal;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Text;
|
||||
|
||||
namespace CefNet.Avalonia
|
||||
{
|
||||
public static class CefNetAvaloniaExtensions
|
||||
{
|
||||
#pragma warning disable IDE0060
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
internal static void Invoke<TEventArgs>(this RoutedEvent routedEvent, Interactive sender, TEventArgs e)
|
||||
where TEventArgs : class
|
||||
{
|
||||
sender.RaiseEvent(e as RoutedEventArgs);
|
||||
}
|
||||
#pragma warning restore IDE0060
|
||||
|
||||
/// <summary>
|
||||
/// Converts the specified <see cref="Key"/> into a virtual key.
|
||||
/// </summary>
|
||||
/// <param name="key">The key code.</param>
|
||||
/// <returns>The virtual key code.</returns>
|
||||
public static VirtualKeys ToVirtualKey(this Key key)
|
||||
{
|
||||
if (key >= Key.LeftShift && key <= Key.RightAlt)
|
||||
return (VirtualKeys)((key - Key.LeftShift) >> 1) | VirtualKeys.ShiftKey; // VK_SHIFT, VK_CONTROL, VK_MENU
|
||||
if (key == Key.System)
|
||||
return VirtualKeys.Menu; // VK_MENU
|
||||
return (VirtualKeys)KeyInterop.VirtualKeyFromKey(key);
|
||||
}
|
||||
|
||||
public static Color ToColor(this CefColor color)
|
||||
{
|
||||
return Color.FromArgb(color.A, color.R, color.G, color.B);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts a drag drop effects to the CEF dragging operation mask.
|
||||
/// </summary>
|
||||
/// <param name="self">The drag drop effects.</param>
|
||||
/// <returns></returns>
|
||||
public static CefDragOperationsMask ToCefDragOperationsMask(this DragDropEffects self)
|
||||
{
|
||||
CefDragOperationsMask effects = CefDragOperationsMask.None;
|
||||
if (self.HasFlag(DragDropEffects.Copy))
|
||||
effects |= CefDragOperationsMask.Copy;
|
||||
if (self.HasFlag(DragDropEffects.Move))
|
||||
effects |= CefDragOperationsMask.Move;
|
||||
if (self.HasFlag(DragDropEffects.Link))
|
||||
effects |= CefDragOperationsMask.Link;
|
||||
return effects;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts the CEF dragging operation mask to drag drop effects.
|
||||
/// </summary>
|
||||
/// <param name="self">The CEF dragging operation mask.</param>
|
||||
/// <returns></returns>
|
||||
public static DragDropEffects ToDragDropEffects(this CefDragOperationsMask self)
|
||||
{
|
||||
DragDropEffects effects = DragDropEffects.None;
|
||||
if (self.HasFlag(CefDragOperationsMask.Every))
|
||||
effects |= DragDropEffects.Copy | DragDropEffects.Link | DragDropEffects.Move;
|
||||
if (self.HasFlag(CefDragOperationsMask.Copy))
|
||||
effects |= DragDropEffects.Copy;
|
||||
if (self.HasFlag(CefDragOperationsMask.Move))
|
||||
effects |= DragDropEffects.Move;
|
||||
if (self.HasFlag(CefDragOperationsMask.Link))
|
||||
effects |= DragDropEffects.Link;
|
||||
return effects;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the current state of the SHIFT, CTRL, and ALT keys, as well as the state of the mouse buttons.
|
||||
/// </summary>
|
||||
/// <param name="e">The <see cref="DragEventArgs"/> instance containing the event data.</param>
|
||||
/// <returns></returns>
|
||||
public static CefEventFlags GetModifiers(this DragEventArgs e)
|
||||
{
|
||||
#pragma warning disable CS0618 // Obsoleted InputModifiers
|
||||
CefEventFlags flags = CefEventFlags.None;
|
||||
InputModifiers state = e.Modifiers;
|
||||
if (state.HasFlag(InputModifiers.LeftMouseButton))
|
||||
flags |= CefEventFlags.LeftMouseButton;
|
||||
if (state.HasFlag(InputModifiers.RightMouseButton))
|
||||
flags |= CefEventFlags.RightMouseButton;
|
||||
if (state.HasFlag(InputModifiers.Shift))
|
||||
flags |= CefEventFlags.ShiftDown;
|
||||
if (state.HasFlag(InputModifiers.Control))
|
||||
flags |= CefEventFlags.ControlDown;
|
||||
if (state.HasFlag(InputModifiers.MiddleMouseButton))
|
||||
flags |= CefEventFlags.MiddleMouseButton;
|
||||
if (state.HasFlag(InputModifiers.Alt))
|
||||
flags |= CefEventFlags.AltDown;
|
||||
if (state.HasFlag(InputModifiers.Windows))
|
||||
flags |= CefEventFlags.CommandDown;
|
||||
return flags;
|
||||
#pragma warning restore CS0618
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the drag data.
|
||||
/// </summary>
|
||||
/// <param name="e">The <see cref="DragEventArgs"/> instance containing the event data.</param>
|
||||
public static CefDragData GetCefDragData(this DragEventArgs e)
|
||||
{
|
||||
CefDragData dragData;
|
||||
if (e.Data.Contains(nameof(CefDragData)))
|
||||
{
|
||||
dragData = (CefDragData)e.Data.Get(nameof(CefDragData));
|
||||
if (dragData != null)
|
||||
{
|
||||
dragData.ResetFileContents();
|
||||
return dragData;
|
||||
}
|
||||
}
|
||||
|
||||
dragData = new CefDragData();
|
||||
|
||||
string[] formats = e.Data.GetDataFormats().ToArray();
|
||||
|
||||
if (TryGetFileDropData(e.Data, out IEnumerable<string> fileNames))
|
||||
{
|
||||
foreach (string filePath in fileNames)
|
||||
{
|
||||
dragData.AddFile(filePath.Replace("\\", "/"), Path.GetFileName(filePath));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool isUrl = false;
|
||||
string s = GetUrlString(e.Data, formats);
|
||||
if (!string.IsNullOrWhiteSpace(s))
|
||||
{
|
||||
isUrl = true;
|
||||
dragData.LinkUrl = s;
|
||||
}
|
||||
|
||||
if (formats.Contains(CefNetDragData.DataFormatUnicodeText))
|
||||
{
|
||||
s = (string)e.Data.Get(CefNetDragData.DataFormatUnicodeText);
|
||||
|
||||
if (!isUrl && Uri.IsWellFormedUriString(s, UriKind.Absolute))
|
||||
dragData.LinkUrl = s;
|
||||
dragData.FragmentText = s;
|
||||
}
|
||||
else if (formats.Contains(DataFormats.Text))
|
||||
{
|
||||
s = (string)e.Data.Get(DataFormats.Text);
|
||||
|
||||
if (!isUrl && Uri.IsWellFormedUriString(s, UriKind.Absolute))
|
||||
dragData.LinkUrl = s;
|
||||
dragData.FragmentText = s;
|
||||
}
|
||||
|
||||
if (formats.Contains(CefNetDragData.DataFormatHtml))
|
||||
{
|
||||
dragData.FragmentHtml = Encoding.UTF8.GetString((byte[])e.Data.Get(CefNetDragData.DataFormatHtml));
|
||||
}
|
||||
else if (formats.Contains(CefNetDragData.DataFormatTextHtml))
|
||||
{
|
||||
dragData.FragmentHtml = Encoding.UTF8.GetString((byte[])e.Data.Get(CefNetDragData.DataFormatTextHtml));
|
||||
}
|
||||
|
||||
return dragData;
|
||||
}
|
||||
|
||||
private static bool TryGetFileDropData(IDataObject data, out IEnumerable<string> fileNames)
|
||||
{
|
||||
if (data.Contains(CefNetDragData.DataFormatFileDrop))
|
||||
fileNames = (IEnumerable<string>)data.Get(CefNetDragData.DataFormatFileDrop);
|
||||
else if (data.Contains(CefNetDragData.DataFormatFileNames))
|
||||
fileNames = (IEnumerable<string>)data.Get(CefNetDragData.DataFormatFileNames);
|
||||
else
|
||||
fileNames = null;
|
||||
return fileNames != null;
|
||||
}
|
||||
|
||||
private static string GetUrlString(IDataObject data, string[] formats)
|
||||
{
|
||||
if (formats.Contains(CefNetDragData.DataFormatUnicodeUrl))
|
||||
return Encoding.Unicode.GetString((byte[])data.Get(CefNetDragData.DataFormatUnicodeUrl));
|
||||
|
||||
if (formats.Contains(CefNetDragData.DataFormatUrl))
|
||||
return Encoding.ASCII.GetString((byte[])data.Get(CefNetDragData.DataFormatUrl));
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,138 +0,0 @@
|
||||
using Avalonia.Input;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
namespace CefNet.Avalonia
|
||||
{
|
||||
public class CefNetDragData : IDataObject
|
||||
{
|
||||
internal const string DataFormatUrl = "UniformResourceLocator";
|
||||
internal const string DataFormatUnicodeUrl = "UniformResourceLocatorW";
|
||||
internal const string DataFormatTextHtml = "text/html";
|
||||
internal const string DataFormatUnicodeText = "UnicodeText";
|
||||
internal const string DataFormatHtml = "HTML Format";
|
||||
internal const string DataFormatFileDrop = "FileDrop";
|
||||
internal const string DataFormatFileNames = "FileNames";
|
||||
|
||||
public const string DataFormatCefNetDragData = nameof(CefNetDragData);
|
||||
public const string DataFormatCefDragData = nameof(CefDragData);
|
||||
|
||||
private WeakReference<WebView> _source;
|
||||
private HashSet<string> _formats;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="CefNetDragData"/> class.
|
||||
/// </summary>
|
||||
/// <param name="source">The source of the drag event.</param>
|
||||
/// <param name="data">The original drag data.</param>
|
||||
public CefNetDragData(WebView source, CefDragData data)
|
||||
{
|
||||
var formats = new HashSet<string>();
|
||||
formats.Add(DataFormatCefNetDragData);
|
||||
formats.Add(DataFormatCefDragData);
|
||||
if (data.IsFile)
|
||||
{
|
||||
formats.Add(DataFormatFileDrop);
|
||||
formats.Add(DataFormatFileNames);
|
||||
}
|
||||
if (data.IsLink)
|
||||
{
|
||||
formats.Add(DataFormatUnicodeUrl);
|
||||
formats.Add(DataFormatUnicodeText);
|
||||
}
|
||||
if (data.IsFragment)
|
||||
{
|
||||
formats.Add(DataFormatUnicodeText);
|
||||
formats.Add(DataFormatHtml);
|
||||
formats.Add(DataFormatTextHtml);
|
||||
}
|
||||
|
||||
_source = new WeakReference<WebView>(source);
|
||||
_formats = formats;
|
||||
this.Data = data;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The original drag data.
|
||||
/// </summary>
|
||||
public CefDragData Data { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The source of the drag event.
|
||||
/// </summary>
|
||||
public WebView Source
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_source.TryGetTarget(out WebView source))
|
||||
return source;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public bool Contains(string format)
|
||||
{
|
||||
return _formats.Contains(format);
|
||||
}
|
||||
|
||||
public object Get(string format)
|
||||
{
|
||||
Debug.Print("GetData: " + format);
|
||||
string s;
|
||||
if (DataFormatUnicodeUrl.Equals(format, StringComparison.Ordinal))
|
||||
{
|
||||
s = Data.LinkUrl;
|
||||
return s is null ? null : new MemoryStream(Encoding.Unicode.GetBytes(s));
|
||||
}
|
||||
if (DataFormatUrl.Equals(format, StringComparison.Ordinal))
|
||||
{
|
||||
s = Data.LinkUrl;
|
||||
return s is null ? null : new MemoryStream(Encoding.ASCII.GetBytes(s));
|
||||
}
|
||||
if (DataFormatUnicodeText.Equals(format, StringComparison.Ordinal))
|
||||
{
|
||||
if (Data.IsLink)
|
||||
return Data.LinkUrl;
|
||||
return Data.FragmentText;
|
||||
}
|
||||
if (DataFormatHtml.Equals(format, StringComparison.Ordinal))
|
||||
return Data.FragmentHtml;
|
||||
if (DataFormats.Text.Equals(format, StringComparison.Ordinal))
|
||||
return Data.FragmentText;
|
||||
if (DataFormatTextHtml.Equals(format, StringComparison.Ordinal))
|
||||
return Data.FragmentHtml;
|
||||
if (DataFormatCefDragData.Equals(format, StringComparison.Ordinal))
|
||||
return Data;
|
||||
if (DataFormatCefNetDragData.Equals(format, StringComparison.Ordinal))
|
||||
return this;
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public IEnumerable<string> GetDataFormats()
|
||||
{
|
||||
return _formats;
|
||||
}
|
||||
|
||||
public IEnumerable<string> GetFileNames()
|
||||
{
|
||||
using (var list = new CefStringList())
|
||||
{
|
||||
Data.GetFileNames(list);
|
||||
|
||||
foreach (string s in list)
|
||||
yield return s;
|
||||
}
|
||||
}
|
||||
|
||||
public string GetText()
|
||||
{
|
||||
if (Data.IsLink)
|
||||
return Data.LinkUrl;
|
||||
return Data.FragmentText;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
using Avalonia.Input;
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace CefNet.Avalonia
|
||||
{
|
||||
public class CursorChangeEventArgs : HandledEventArgs
|
||||
{
|
||||
public CursorChangeEventArgs(Cursor cursor, CefCursorType cursorType)
|
||||
{
|
||||
this.Cursor = cursor;
|
||||
this.CursorType = cursorType;
|
||||
}
|
||||
|
||||
public Cursor Cursor { get; }
|
||||
|
||||
public CefCursorType CursorType { get; }
|
||||
}
|
||||
}
|
||||
@@ -1,140 +0,0 @@
|
||||
#if MODERNFORMS
|
||||
using Modern.Forms;
|
||||
#else
|
||||
using Avalonia;
|
||||
using Avalonia.Input;
|
||||
using Avalonia.Media.Imaging;
|
||||
using Avalonia.Platform;
|
||||
#endif
|
||||
|
||||
using CefNet.Internal;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
|
||||
#if MODERNFORMS
|
||||
namespace CefNet.Modern.Forms
|
||||
#else
|
||||
namespace CefNet.Avalonia
|
||||
#endif
|
||||
{
|
||||
public sealed class CustomCursor
|
||||
{
|
||||
public unsafe static Cursor Create(ref CefCursorInfo cursorInfo)
|
||||
{
|
||||
return Cursor.Default; // Not supported
|
||||
|
||||
/*
|
||||
CefSize size = cursorInfo.Size;
|
||||
|
||||
var bufferSize = size.Width * size.Height * 4;
|
||||
int ICON_HEADER_SIZE = sizeof(ICONDIR);
|
||||
var stream = new MemoryStream(bufferSize);
|
||||
{
|
||||
if (stream.Seek(ICON_HEADER_SIZE, SeekOrigin.Begin) != ICON_HEADER_SIZE)
|
||||
{
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
stream.Write(new byte[ICON_HEADER_SIZE], 0, ICON_HEADER_SIZE);
|
||||
}
|
||||
using (var image = new WriteableBitmap(new PixelSize(size.Width, size.Height), OffscreenGraphics.Dpi, PixelFormat.Bgra8888))
|
||||
{
|
||||
using (ILockedFramebuffer frameBuffer = image.Lock())
|
||||
{
|
||||
System.Runtime.CompilerServices.Unsafe.CopyBlock((void*)frameBuffer.Address, (void*)cursorInfo.Buffer, (uint)bufferSize);
|
||||
}
|
||||
image.Save(stream); // Save in png format!!!
|
||||
}
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
}
|
||||
|
||||
CefPoint hotSpot = cursorInfo.Hotspot;
|
||||
|
||||
var icon = new ICONDIR();
|
||||
icon.IconType = 2;
|
||||
icon.ImagesCount = 1;
|
||||
icon.Width = (byte)size.Width;
|
||||
icon.Height = (byte)size.Height;
|
||||
icon.HotSpotX = (short)hotSpot.X;
|
||||
icon.HotSpotY = (short)hotSpot.Y;
|
||||
icon.BytesInRes = (int)stream.Length - ICON_HEADER_SIZE;
|
||||
icon.ImageOffset = ICON_HEADER_SIZE;
|
||||
|
||||
using (var iconHead = new UnmanagedMemoryStream(icon._data, ICON_HEADER_SIZE))
|
||||
{
|
||||
iconHead.CopyTo(stream);
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
}
|
||||
|
||||
return new Cursor(stream);
|
||||
*/
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Explicit, Pack = 1, Size = 22)]
|
||||
unsafe struct ICONDIR
|
||||
{
|
||||
[FieldOffset(0)]
|
||||
public fixed byte _data[22];
|
||||
|
||||
/// <summary>
|
||||
/// Reserved. Must always be 0.
|
||||
/// </summary>
|
||||
[FieldOffset(0)]
|
||||
public short IDReserved;
|
||||
/// <summary>
|
||||
/// Specifies image type: 1 for icon (.ICO) image, 2 for cursor (.CUR) image.
|
||||
/// </summary>
|
||||
[FieldOffset(2)]
|
||||
public short IconType;
|
||||
/// <summary>
|
||||
/// Specifies number of images in the file.
|
||||
/// </summary>
|
||||
[FieldOffset(4)]
|
||||
public short ImagesCount;
|
||||
/// <summary>
|
||||
/// Specifies image width in pixels. Can be any number between 0 and 255. Value 0 means image width is 256 pixels.
|
||||
/// </summary>
|
||||
[FieldOffset(6)]
|
||||
public byte Width;
|
||||
/// <summary>
|
||||
/// Specifies image height in pixels. Can be any number between 0 and 255. Value 0 means image height is 256 pixels.
|
||||
/// </summary>
|
||||
[FieldOffset(7)]
|
||||
public byte Height;
|
||||
/// <summary>
|
||||
/// Specifies number of colors in the color palette. Should be 0 if the image does not use a color palette.
|
||||
/// </summary>
|
||||
[FieldOffset(8)]
|
||||
public byte ColorCount;
|
||||
/// <summary>
|
||||
/// Reserved. Should be 0.
|
||||
/// </summary>
|
||||
[FieldOffset(9)]
|
||||
public byte IDEReserved;
|
||||
/// <summary>
|
||||
/// Specifies the horizontal coordinates of the hotspot in number of pixels from the left.
|
||||
/// </summary>
|
||||
[FieldOffset(10)]
|
||||
public short HotSpotX;
|
||||
/// <summary>
|
||||
/// Specifies the vertical coordinates of the hotspot in number of pixels from the top.
|
||||
/// </summary>
|
||||
[FieldOffset(12)]
|
||||
public short HotSpotY;
|
||||
/// <summary>
|
||||
/// Specifies the size of the image's data in bytes
|
||||
/// </summary>
|
||||
[FieldOffset(14)]
|
||||
public int BytesInRes;
|
||||
/// <summary>
|
||||
/// Specifies the offset of BMP or PNG data from the beginning of the ICO/CUR file
|
||||
/// </summary>
|
||||
[FieldOffset(18)]
|
||||
public int ImageOffset;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,121 +0,0 @@
|
||||
using Avalonia;
|
||||
using Avalonia.Collections;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Interactivity;
|
||||
using Avalonia.Media;
|
||||
using Avalonia.Threading;
|
||||
using CefNet.Avalonia;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CefNet.Internal
|
||||
{
|
||||
internal sealed class AvaloniaContextMenuRunner
|
||||
{
|
||||
private readonly MenuModel Model;
|
||||
private CefRunContextMenuCallback Callback;
|
||||
private ContextMenu Menu;
|
||||
private TaskCompletionSource<bool> _completionSource;
|
||||
|
||||
public AvaloniaContextMenuRunner(CefMenuModel model, CefRunContextMenuCallback callback)
|
||||
{
|
||||
Model = MenuModel.FromCefMenu(model);
|
||||
Callback = callback;
|
||||
}
|
||||
|
||||
public void Build()
|
||||
{
|
||||
if (Menu != null)
|
||||
throw new InvalidOperationException();
|
||||
|
||||
Menu = new ContextMenu();
|
||||
Menu.MenuClosed += Menu_Closed;
|
||||
Build(Model, (AvaloniaList<object>)Menu.Items);
|
||||
}
|
||||
|
||||
private void Menu_Closed(object sender, RoutedEventArgs e)
|
||||
{
|
||||
Cancel();
|
||||
}
|
||||
|
||||
private void MenuItem_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var clickedItem = sender as MenuItem;
|
||||
object cid = clickedItem?.Tag;
|
||||
if (cid != null)
|
||||
{
|
||||
Callback.Continue((int)cid, CefEventFlags.LeftMouseButton);
|
||||
Callback = null;
|
||||
}
|
||||
}
|
||||
|
||||
public Task CompletionTask
|
||||
{
|
||||
get { return _completionSource?.Task; }
|
||||
}
|
||||
|
||||
private void Build(MenuModel model, AvaloniaList<object> menu)
|
||||
{
|
||||
int count = model.Count;
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
bool isSubmenu = false;
|
||||
MenuItem menuItem;
|
||||
switch (model.GetTypeAt(i))
|
||||
{
|
||||
case CefMenuItemType.Separator:
|
||||
menu.Add(new Separator());
|
||||
continue;
|
||||
case CefMenuItemType.Check:
|
||||
menuItem = new MenuItem();
|
||||
menuItem.Icon = new CheckBox() { IsChecked = model.IsCheckedAt(i), Margin = new Thickness(-2, 0, 0, 0), BorderThickness = new Thickness() };
|
||||
break;
|
||||
case CefMenuItemType.Radio:
|
||||
menuItem = new MenuItem();
|
||||
menuItem.Icon = new RadioButton() { IsChecked = model.IsCheckedAt(i), Margin = new Thickness(-2, 0, 0, 0), BorderThickness = new Thickness() };
|
||||
break;
|
||||
case CefMenuItemType.Command:
|
||||
menuItem = new MenuItem();
|
||||
break;
|
||||
case CefMenuItemType.Submenu:
|
||||
isSubmenu = true;
|
||||
menuItem = new MenuItem();
|
||||
if (model.IsEnabledAt(i))
|
||||
{
|
||||
Build(model.GetSubMenuAt(i), (AvaloniaList<object>)menuItem.Items);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
if (!isSubmenu)
|
||||
{
|
||||
menuItem.Click += MenuItem_Click;
|
||||
menuItem.Tag = model.GetCommandIdAt(i);
|
||||
}
|
||||
menuItem.Header = model.GetLabelAt(i).Replace('&', '_');
|
||||
menuItem.IsEnabled = model.IsEnabledAt(i);
|
||||
//menuItem.Foreground = model.GetColorAt(i, CefMenuColorType.Text, out CefColor color) ? new SolidColorBrush(color.ToColor()) : SystemColors.MenuTextBrush;
|
||||
menu.Add(menuItem);
|
||||
}
|
||||
}
|
||||
|
||||
public void RunMenuAt(Control control, Point point)
|
||||
{
|
||||
_completionSource = new TaskCompletionSource<bool>();
|
||||
Dispatcher.UIThread.Post(() =>
|
||||
{
|
||||
Menu.Open(control);
|
||||
_completionSource.TrySetResult(true);
|
||||
});
|
||||
}
|
||||
|
||||
public void Cancel()
|
||||
{
|
||||
_completionSource?.TrySetResult(false);
|
||||
Callback?.Cancel();
|
||||
Callback = null;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,125 +0,0 @@
|
||||
using Avalonia.Input;
|
||||
using CefNet.Avalonia;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace CefNet.Internal
|
||||
{
|
||||
public class AvaloniaWebViewGlue : WebViewGlue
|
||||
{
|
||||
public AvaloniaWebViewGlue(IAvaloniaWebViewPrivate view)
|
||||
: base(view)
|
||||
{
|
||||
}
|
||||
|
||||
public new IAvaloniaWebViewPrivate WebView
|
||||
{
|
||||
get { return (IAvaloniaWebViewPrivate)base.WebView; }
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override bool OnCursorChange(CefBrowser browser, IntPtr cursorHandle, CefCursorType type, CefCursorInfo customCursorInfo)
|
||||
{
|
||||
var ea = new CursorChangeEventArgs(type != CefCursorType.Custom ? CursorInteropHelper.Create(cursorHandle) : CustomCursor.Create(ref customCursorInfo), type);
|
||||
WebView.RaiseCefCursorChange(ea);
|
||||
return ea.Handled;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override bool OnTooltip(CefBrowser browser, ref string text)
|
||||
{
|
||||
WebView.CefSetToolTip(text);
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void OnStatusMessage(CefBrowser browser, string message)
|
||||
{
|
||||
WebView.CefSetStatusText(message);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Called when the user starts dragging content in the web view. OS APIs that run a system message
|
||||
/// loop may be used within the StartDragging call. Don't call any of CefBrowserHost::DragSource*Ended*
|
||||
/// methods after returning false. Call CefBrowserHost::DragSourceEndedAt and DragSourceSystemDragEnded
|
||||
/// either synchronously or asynchronously to inform the web view that the drag operation has ended.
|
||||
/// </summary>
|
||||
/// <param name="browser"></param>
|
||||
/// <param name="dragData">The contextual information about the dragged content.</param>
|
||||
/// <param name="allowedOps"></param>
|
||||
/// <param name="x">The X-location in screen coordinates.</param>
|
||||
/// <param name="y">The Y-location in screen coordinates.</param>
|
||||
/// <returns>Return false to abort the drag operation or true to handle the drag operation.</returns>
|
||||
protected override bool StartDragging(CefBrowser browser, CefDragData dragData, CefDragOperationsMask allowedOps, int x, int y)
|
||||
{
|
||||
var e = new StartDraggingEventArgs(dragData, allowedOps, x, y);
|
||||
WebView.RaiseStartDragging(e);
|
||||
return e.Handled;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Called when the web view wants to update the mouse cursor during a drag & drop operation.
|
||||
/// </summary>
|
||||
/// <param name="browser"></param>
|
||||
/// <param name="operation">Describes the allowed operation (none, move, copy, link).</param>
|
||||
protected override void UpdateDragCursor(CefBrowser browser, CefDragOperationsMask operation)
|
||||
{
|
||||
Cursor cursor;
|
||||
CefCursorType cursorType;
|
||||
switch(operation)
|
||||
{
|
||||
case CefDragOperationsMask.None:
|
||||
cursor = CursorInteropHelper.Create(StandardCursorType.No);
|
||||
cursorType = CefCursorType.Notallowed;
|
||||
break;
|
||||
case CefDragOperationsMask.Move:
|
||||
cursor = CursorInteropHelper.Create(StandardCursorType.DragMove);
|
||||
cursorType = CefCursorType.Move;
|
||||
break;
|
||||
case CefDragOperationsMask.Link:
|
||||
cursor = CursorInteropHelper.Create(StandardCursorType.DragLink);
|
||||
cursorType = CefCursorType.Alias;
|
||||
break;
|
||||
default:
|
||||
cursor = CursorInteropHelper.Create(StandardCursorType.DragCopy);
|
||||
cursorType = CefCursorType.Copy;
|
||||
break;
|
||||
}
|
||||
WebView.RaiseCefCursorChange(new CursorChangeEventArgs(cursor, cursorType));
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void OnFindResult(CefBrowser browser, int identifier, int count, CefRect selectionRect, int activeMatchOrdinal, bool finalUpdate)
|
||||
{
|
||||
WebView.RaiseTextFound(new TextFoundRoutedEventArgs(identifier, count, selectionRect, activeMatchOrdinal, finalUpdate));
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void OnPdfPrintFinished(string path, bool success)
|
||||
{
|
||||
WebView.RaisePdfPrintFinished(new PdfPrintFinishedRoutedEventArgs(path, success));
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override bool OnJSDialog(CefBrowser browser, string originUrl, CefJSDialogType dialogType, string messageText, string defaultPromptText, CefJSDialogCallback callback, ref int suppressMessage)
|
||||
{
|
||||
ScriptDialogDeferral dialogDeferral = CreateScriptDialogDeferral(callback);
|
||||
var ea = new ScriptDialogOpeningRoutedEventArgs(originUrl, (ScriptDialogKind)dialogType, messageText, defaultPromptText, dialogDeferral);
|
||||
WebView.RaiseScriptDialogOpening(ea);
|
||||
suppressMessage = ea.Suppress ? 1 : 0;
|
||||
if (!ea.Handled) ((IDisposable)dialogDeferral).Dispose();
|
||||
return ea.Handled;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override bool OnBeforeUnloadDialog(CefBrowser browser, string messageText, bool isReload, CefJSDialogCallback callback)
|
||||
{
|
||||
ScriptDialogDeferral dialogDeferral = CreateScriptDialogDeferral(callback);
|
||||
var ea = new ScriptDialogOpeningRoutedEventArgs(messageText, isReload, dialogDeferral);
|
||||
WebView.RaiseScriptDialogOpening(ea);
|
||||
if (!ea.Handled) ((IDisposable)dialogDeferral).Dispose();
|
||||
return ea.Handled;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
#if AvaloniaBeta
|
||||
using Avalonia.Input;
|
||||
using Avalonia.Platform;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
|
||||
namespace CefNet.Internal
|
||||
{
|
||||
public static class CursorInteropHelper
|
||||
{
|
||||
private static readonly Dictionary<IntPtr, Cursor> _Cursors = new Dictionary<IntPtr, Cursor>();
|
||||
private static readonly Dictionary<StandardCursorType, Cursor> _StdCursors = new Dictionary<StandardCursorType, Cursor>();
|
||||
|
||||
private static IntPtr GetPlatformHandle(Cursor cursor)
|
||||
{
|
||||
if (cursor != null)
|
||||
{
|
||||
if (cursor.PlatformImpl is IPlatformHandle i)
|
||||
{
|
||||
return i.Handle;
|
||||
}
|
||||
}
|
||||
return default;
|
||||
}
|
||||
|
||||
static CursorInteropHelper()
|
||||
{
|
||||
foreach (StandardCursorType cursorType in Enum.GetValues(typeof(StandardCursorType)))
|
||||
{
|
||||
var cursor = new Cursor(cursorType);
|
||||
var handle = GetPlatformHandle(cursor);
|
||||
if (handle == default || _Cursors.ContainsKey(handle))
|
||||
continue;
|
||||
|
||||
_Cursors.Add(handle, cursor);
|
||||
_StdCursors.Add(cursorType, cursor);
|
||||
}
|
||||
}
|
||||
|
||||
public static Cursor Create(IntPtr cursorHandle)
|
||||
{
|
||||
if (_Cursors.TryGetValue(cursorHandle, out Cursor cursor))
|
||||
return cursor;
|
||||
return Cursor.Default;
|
||||
}
|
||||
|
||||
public static Cursor Create(StandardCursorType cursorType)
|
||||
{
|
||||
Cursor cursor;
|
||||
lock (_StdCursors)
|
||||
{
|
||||
if (!_StdCursors.TryGetValue(cursorType, out cursor))
|
||||
{
|
||||
cursor = new Cursor(cursorType);
|
||||
_StdCursors[cursorType] = cursor;
|
||||
}
|
||||
}
|
||||
return cursor;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -1,48 +0,0 @@
|
||||
using Avalonia.Input;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace CefNet.Internal
|
||||
{
|
||||
public static class CursorInteropHelper
|
||||
{
|
||||
private static readonly Dictionary<IntPtr, Cursor> _Cursors = new Dictionary<IntPtr, Cursor>();
|
||||
private static readonly Dictionary<StandardCursorType, Cursor> _StdCursors = new Dictionary<StandardCursorType, Cursor>();
|
||||
|
||||
static CursorInteropHelper()
|
||||
{
|
||||
foreach(StandardCursorType cursorType in Enum.GetValues(typeof(StandardCursorType)))
|
||||
{
|
||||
var cursor = new Cursor(cursorType);
|
||||
if (_Cursors.ContainsKey(cursor.PlatformCursor.Handle))
|
||||
continue;
|
||||
|
||||
_Cursors.Add(cursor.PlatformCursor.Handle, cursor);
|
||||
_StdCursors.Add(cursorType, cursor);
|
||||
}
|
||||
}
|
||||
|
||||
public static Cursor Create(IntPtr cursorHandle)
|
||||
{
|
||||
if (_Cursors.TryGetValue(cursorHandle, out Cursor cursor))
|
||||
return cursor;
|
||||
return Cursor.Default;
|
||||
}
|
||||
|
||||
public static Cursor Create(StandardCursorType cursorType)
|
||||
{
|
||||
Cursor cursor;
|
||||
lock (_StdCursors)
|
||||
{
|
||||
if (!_StdCursors.TryGetValue(cursorType, out cursor))
|
||||
{
|
||||
cursor = new Cursor(cursorType);
|
||||
_StdCursors[cursorType] = cursor;
|
||||
}
|
||||
}
|
||||
return cursor;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,61 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Avalonia;
|
||||
|
||||
namespace CefNet.Internal
|
||||
{
|
||||
/// <summary>
|
||||
/// Stores DPI information from which a <see cref="Avalonia.Layout.Visual"/> is rendered.
|
||||
/// </summary>
|
||||
///
|
||||
public struct DpiScale
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="DpiScale"/> structure.
|
||||
/// </summary>
|
||||
/// <param name="dpiScaleX">The DPI scale on the X axis.</param>
|
||||
/// <param name="dpiScaleY">The DPI scale on the Y axis.</param>
|
||||
public DpiScale(double dpiScaleX, double dpiScaleY)
|
||||
{
|
||||
this.DpiScaleX = dpiScaleX;
|
||||
this.DpiScaleY = dpiScaleY;
|
||||
this.PixelsPerDip = 96.0;
|
||||
this.PixelsPerInchX = dpiScaleX * 96.0;
|
||||
this.PixelsPerInchY = dpiScaleY * 96.0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the DPI scale on the X axis.
|
||||
/// </summary>
|
||||
public double DpiScaleX { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the DPI scale on the Y axis.
|
||||
/// </summary>
|
||||
public double DpiScaleY { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the PixelsPerDip at which the text should be rendered.
|
||||
/// </summary>
|
||||
public double PixelsPerDip { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the DPI along X axis.
|
||||
/// </summary>
|
||||
public double PixelsPerInchX { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the DPI along Y axis.
|
||||
/// </summary>
|
||||
public double PixelsPerInchY { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the DPI.
|
||||
/// </summary>
|
||||
public Vector Dpi
|
||||
{
|
||||
get { return new Vector(PixelsPerInchX, PixelsPerInchY); }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,172 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Controls.ApplicationLifetimes;
|
||||
using Avalonia.Interactivity;
|
||||
using System.Runtime.InteropServices;
|
||||
using Avalonia.VisualTree;
|
||||
using CefNet.WinApi;
|
||||
using CefNet.Avalonia;
|
||||
|
||||
namespace CefNet.Internal
|
||||
{
|
||||
sealed class GlobalHooks
|
||||
{
|
||||
private static bool IsInitialized;
|
||||
|
||||
private static Dictionary<IntPtr, GlobalHooks> _HookedWindows = new Dictionary<IntPtr, GlobalHooks>();
|
||||
private static List<WeakReference<WebView>> _Views = new List<WeakReference<WebView>>();
|
||||
|
||||
internal static void Initialize(WebView view)
|
||||
{
|
||||
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
return;
|
||||
|
||||
lock(_Views)
|
||||
{
|
||||
_Views.Add(new WeakReference<WebView>(view));
|
||||
}
|
||||
|
||||
if (IsInitialized)
|
||||
return;
|
||||
|
||||
IsInitialized = true;
|
||||
|
||||
var lifetime = Application.Current.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime;
|
||||
if (lifetime is null)
|
||||
return;
|
||||
|
||||
|
||||
Window.WindowOpenedEvent.AddClassHandler(typeof(Window), TryAddGlobalHook, handledEventsToo: true);
|
||||
//EventManager.RegisterClassHandler(typeof(Window), FrameworkElement.SizeChangedEvent, new RoutedEventHandler(TryAddGlobalHook));
|
||||
|
||||
foreach (Window window in lifetime.Windows)
|
||||
{
|
||||
TryAddGlobalHook(window);
|
||||
}
|
||||
}
|
||||
|
||||
private WindowsHwndSource _source;
|
||||
private WeakReference<Window> _windowRef;
|
||||
|
||||
private GlobalHooks(WindowsHwndSource source, Window window)
|
||||
{
|
||||
_source = source;
|
||||
_windowRef = new WeakReference<Window>(window);
|
||||
source.WndProcCallback = WndProc;
|
||||
}
|
||||
|
||||
private unsafe IntPtr WndProc(IntPtr hwnd, int message, IntPtr wParam, IntPtr lParam, ref bool handled)
|
||||
{
|
||||
const int WM_ENTERMENULOOP = 0x0211;
|
||||
const int WM_EXITMENULOOP = 0x0212;
|
||||
|
||||
switch (message)
|
||||
{
|
||||
case 0x0002: // WM_DESTROY
|
||||
_source.WndProcCallback = null;
|
||||
foreach (var tuple in GetViews(hwnd))
|
||||
{
|
||||
tuple.Item1.Close();
|
||||
}
|
||||
lock (_HookedWindows)
|
||||
{
|
||||
_HookedWindows.Remove(_source.Handle);
|
||||
_source.Dispose();
|
||||
}
|
||||
break;
|
||||
case 0x0047: //WM_WINDOWPOSCHANGED
|
||||
WINDOWPOS* windowPos = (WINDOWPOS*)lParam;
|
||||
if ((windowPos->flags & 0x0002) != 0) // SWP_NOMOVE
|
||||
break;
|
||||
foreach (var tuple in GetViews(hwnd))
|
||||
{
|
||||
tuple.Item1.OnUpdateRootBounds();
|
||||
}
|
||||
break;
|
||||
case 0x0231: // WM_ENTERSIZEMOVE
|
||||
foreach (var tuple in GetViews(hwnd))
|
||||
{
|
||||
tuple.Item1.OnRootResizeBegin(EventArgs.Empty);
|
||||
}
|
||||
break;
|
||||
case 0x0232: // WM_EXITSIZEMOVE
|
||||
foreach (var tuple in GetViews(hwnd))
|
||||
{
|
||||
tuple.Item1.OnRootResizeEnd(EventArgs.Empty);
|
||||
}
|
||||
break;
|
||||
case 0x0112: // WM_SYSCOMMAND
|
||||
const int SC_KEYMENU = 0xF100;
|
||||
// Menu loop must not be runned with Alt key
|
||||
if ((int)(wParam.ToInt64() & 0xFFF0) == SC_KEYMENU && lParam == IntPtr.Zero)
|
||||
{
|
||||
handled = true;
|
||||
}
|
||||
break;
|
||||
case WM_ENTERMENULOOP:
|
||||
if (wParam == IntPtr.Zero)
|
||||
CefApi.SetOSModalLoop(true);
|
||||
break;
|
||||
case WM_EXITMENULOOP:
|
||||
if (wParam == IntPtr.Zero)
|
||||
CefApi.SetOSModalLoop(false);
|
||||
break;
|
||||
}
|
||||
return IntPtr.Zero;
|
||||
}
|
||||
|
||||
private IEnumerable<ValueTuple<WebView, Window>> GetViews(IntPtr hwnd)
|
||||
{
|
||||
if (hwnd != _source.Handle)
|
||||
yield break;
|
||||
|
||||
Window window;
|
||||
if (!_windowRef.TryGetTarget(out window))
|
||||
yield break;
|
||||
|
||||
lock (_Views)
|
||||
{
|
||||
for (int i = 0; i < _Views.Count; i++)
|
||||
{
|
||||
WeakReference<WebView> viewRef = _Views[i];
|
||||
if (viewRef.TryGetTarget(out WebView view))
|
||||
{
|
||||
if (view.GetVisualRoot() == window)
|
||||
{
|
||||
yield return new ValueTuple<WebView, Window>(view, window);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_Views.RemoveAt(i--);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void TryAddGlobalHook(object sender, RoutedEventArgs e)
|
||||
{
|
||||
TryAddGlobalHook(e.Source as Window);
|
||||
}
|
||||
|
||||
private static void TryAddGlobalHook(Window window)
|
||||
{
|
||||
if (window == null)
|
||||
return;
|
||||
|
||||
IntPtr hwnd = window.PlatformImpl.Handle.Handle;
|
||||
|
||||
if (_HookedWindows.ContainsKey(hwnd))
|
||||
return;
|
||||
|
||||
WindowsHwndSource source = WindowsHwndSource.FromHwnd(hwnd);
|
||||
if (source == null)
|
||||
return;
|
||||
|
||||
_HookedWindows.Add(hwnd, new GlobalHooks(source, window));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
using CefNet.Avalonia;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace CefNet.Internal
|
||||
{
|
||||
public interface IAvaloniaWebViewPrivate : IChromiumWebViewPrivate
|
||||
{
|
||||
void RaiseCefCursorChange(CursorChangeEventArgs e);
|
||||
void CefSetToolTip(string text);
|
||||
void CefSetStatusText(string statusText);
|
||||
void RaiseStartDragging(StartDraggingEventArgs e);
|
||||
}
|
||||
}
|
||||
@@ -1,726 +0,0 @@
|
||||
using Avalonia.Input;
|
||||
|
||||
#pragma warning disable CS0219
|
||||
|
||||
namespace CefNet.Internal
|
||||
{
|
||||
/// <summary>
|
||||
/// Provides static methods to convert between Virtual-Keys and the Key enumeration.
|
||||
/// </summary>
|
||||
internal static class KeyInterop
|
||||
{
|
||||
/// <summary>
|
||||
/// Convert Key into a Virtual-Key.
|
||||
/// </summary>
|
||||
public static int VirtualKeyFromKey(Key key)
|
||||
{
|
||||
const int VK_CANCEL = 0x03;
|
||||
const int VK_BACK = 0x08;
|
||||
const int VK_CLEAR = 0x0C;
|
||||
const int VK_RETURN = 0x0D;
|
||||
const int VK_PAUSE = 0x13;
|
||||
const int VK_CAPITAL = 0x14;
|
||||
const int VK_KANA = 0x15;
|
||||
const int VK_HANGEUL = 0x15;
|
||||
const int VK_HANGUL = 0x15;
|
||||
const int VK_JUNJA = 0x17;
|
||||
const int VK_FINAL = 0x18;
|
||||
const int VK_HANJA = 0x19;
|
||||
const int VK_KANJI = 0x19;
|
||||
const int VK_ESCAPE = 0x1B;
|
||||
const int VK_CONVERT = 0x1C;
|
||||
const int VK_NONCONVERT = 0x1D;
|
||||
const int VK_ACCEPT = 0x1E;
|
||||
const int VK_MODECHANGE = 0x1F;
|
||||
const int VK_SPACE = 0x20;
|
||||
const int VK_PRIOR = 0x21;
|
||||
const int VK_NEXT = 0x22;
|
||||
const int VK_END = 0x23;
|
||||
const int VK_HOME = 0x24;
|
||||
const int VK_LEFT = 0x25;
|
||||
const int VK_UP = 0x26;
|
||||
const int VK_RIGHT = 0x27;
|
||||
const int VK_DOWN = 0x28;
|
||||
const int VK_SELECT = 0x29;
|
||||
const int VK_PRINT = 0x2A;
|
||||
const int VK_EXECUTE = 0x2B;
|
||||
const int VK_SNAPSHOT = 0x2C;
|
||||
const int VK_INSERT = 0x2D;
|
||||
const int VK_DELETE = 0x2E;
|
||||
const int VK_HELP = 0x2F;
|
||||
const int VK_0 = 0x30;
|
||||
const int VK_1 = 0x31;
|
||||
const int VK_2 = 0x32;
|
||||
const int VK_3 = 0x33;
|
||||
const int VK_4 = 0x34;
|
||||
const int VK_5 = 0x35;
|
||||
const int VK_6 = 0x36;
|
||||
const int VK_7 = 0x37;
|
||||
const int VK_8 = 0x38;
|
||||
const int VK_9 = 0x39;
|
||||
const int VK_A = 0x41;
|
||||
const int VK_B = 0x42;
|
||||
const int VK_C = 0x43;
|
||||
const int VK_D = 0x44;
|
||||
const int VK_E = 0x45;
|
||||
const int VK_F = 0x46;
|
||||
const int VK_G = 0x47;
|
||||
const int VK_H = 0x48;
|
||||
const int VK_I = 0x49;
|
||||
const int VK_J = 0x4A;
|
||||
const int VK_K = 0x4B;
|
||||
const int VK_L = 0x4C;
|
||||
const int VK_M = 0x4D;
|
||||
const int VK_N = 0x4E;
|
||||
const int VK_O = 0x4F;
|
||||
const int VK_P = 0x50;
|
||||
const int VK_Q = 0x51;
|
||||
const int VK_R = 0x52;
|
||||
const int VK_S = 0x53;
|
||||
const int VK_T = 0x54;
|
||||
const int VK_U = 0x55;
|
||||
const int VK_V = 0x56;
|
||||
const int VK_W = 0x57;
|
||||
const int VK_X = 0x58;
|
||||
const int VK_Y = 0x59;
|
||||
const int VK_Z = 0x5A;
|
||||
const int VK_LWIN = 0x5B;
|
||||
const int VK_RWIN = 0x5C;
|
||||
const int VK_APPS = 0x5D;
|
||||
const int VK_POWER = 0x5E;
|
||||
const int VK_SLEEP = 0x5F;
|
||||
const int VK_NUMPAD0 = 0x60;
|
||||
const int VK_NUMPAD1 = 0x61;
|
||||
const int VK_NUMPAD2 = 0x62;
|
||||
const int VK_NUMPAD3 = 0x63;
|
||||
const int VK_NUMPAD4 = 0x64;
|
||||
const int VK_NUMPAD5 = 0x65;
|
||||
const int VK_NUMPAD6 = 0x66;
|
||||
const int VK_NUMPAD7 = 0x67;
|
||||
const int VK_NUMPAD8 = 0x68;
|
||||
const int VK_NUMPAD9 = 0x69;
|
||||
const int VK_MULTIPLY = 0x6A;
|
||||
const int VK_ADD = 0x6B;
|
||||
const int VK_SEPARATOR = 0x6C;
|
||||
const int VK_SUBTRACT = 0x6D;
|
||||
const int VK_DECIMAL = 0x6E;
|
||||
const int VK_DIVIDE = 0x6F;
|
||||
const int VK_F1 = 0x70;
|
||||
const int VK_F2 = 0x71;
|
||||
const int VK_F3 = 0x72;
|
||||
const int VK_F4 = 0x73;
|
||||
const int VK_F5 = 0x74;
|
||||
const int VK_F6 = 0x75;
|
||||
const int VK_F7 = 0x76;
|
||||
const int VK_F8 = 0x77;
|
||||
const int VK_F9 = 0x78;
|
||||
const int VK_F10 = 0x79;
|
||||
const int VK_F11 = 0x7A;
|
||||
const int VK_F12 = 0x7B;
|
||||
const int VK_F13 = 0x7C;
|
||||
const int VK_F14 = 0x7D;
|
||||
const int VK_F15 = 0x7E;
|
||||
const int VK_F16 = 0x7F;
|
||||
const int VK_F17 = 0x80;
|
||||
const int VK_F18 = 0x81;
|
||||
const int VK_F19 = 0x82;
|
||||
const int VK_F20 = 0x83;
|
||||
const int VK_F21 = 0x84;
|
||||
const int VK_F22 = 0x85;
|
||||
const int VK_F23 = 0x86;
|
||||
const int VK_F24 = 0x87;
|
||||
const int VK_NUMLOCK = 0x90;
|
||||
const int VK_SCROLL = 0x91;
|
||||
const int VK_RSHIFT = 0xA1;
|
||||
const int VK_BROWSER_BACK = 0xA6;
|
||||
const int VK_BROWSER_FORWARD = 0xA7;
|
||||
const int VK_BROWSER_REFRESH = 0xA8;
|
||||
const int VK_BROWSER_STOP = 0xA9;
|
||||
const int VK_BROWSER_SEARCH = 0xAA;
|
||||
const int VK_BROWSER_FAVORITES = 0xAB;
|
||||
const int VK_BROWSER_HOME = 0xAC;
|
||||
const int VK_VOLUME_MUTE = 0xAD;
|
||||
const int VK_VOLUME_DOWN = 0xAE;
|
||||
const int VK_VOLUME_UP = 0xAF;
|
||||
const int VK_MEDIA_NEXT_TRACK = 0xB0;
|
||||
const int VK_MEDIA_PREV_TRACK = 0xB1;
|
||||
const int VK_MEDIA_STOP = 0xB2;
|
||||
const int VK_MEDIA_PLAY_PAUSE = 0xB3;
|
||||
const int VK_LAUNCH_MAIL = 0xB4;
|
||||
const int VK_LAUNCH_MEDIA_SELECT = 0xB5;
|
||||
const int VK_LAUNCH_APP1 = 0xB6;
|
||||
const int VK_LAUNCH_APP2 = 0xB7;
|
||||
const int VK_PROCESSKEY = 0xE5;
|
||||
const int VK_PACKET = 0xE7;
|
||||
const int VK_ATTN = 0xF6;
|
||||
const int VK_CRSEL = 0xF7;
|
||||
const int VK_EXSEL = 0xF8;
|
||||
const int VK_EREOF = 0xF9;
|
||||
const int VK_PLAY = 0xFA;
|
||||
const int VK_ZOOM = 0xFB;
|
||||
const int VK_NONAME = 0xFC;
|
||||
const int VK_PA1 = 0xFD;
|
||||
const int VK_OEM_CLEAR = 0xFE;
|
||||
const int VK_TAB = 0x09;
|
||||
const int VK_SHIFT = 0x10;
|
||||
const int VK_CONTROL = 0x11;
|
||||
const int VK_MENU = 0x12;
|
||||
const int VK_LSHIFT = 0xA0;
|
||||
const int VK_RMENU = 0xA5;
|
||||
const int VK_LMENU = 0xA4;
|
||||
const int VK_LCONTROL = 0xA2;
|
||||
const int VK_RCONTROL = 0xA3;
|
||||
const int VK_LBUTTON = 0x01;
|
||||
const int VK_RBUTTON = 0x02;
|
||||
const int VK_MBUTTON = 0x04;
|
||||
const int VK_XBUTTON1 = 0x05;
|
||||
const int VK_XBUTTON2 = 0x06;
|
||||
const int VK_OEM_1 = 0xBA;
|
||||
const int VK_OEM_PLUS = 0xBB;
|
||||
const int VK_OEM_COMMA = 0xBC;
|
||||
const int VK_OEM_MINUS = 0xBD;
|
||||
const int VK_OEM_PERIOD = 0xBE;
|
||||
const int VK_OEM_2 = 0xBF;
|
||||
const int VK_OEM_3 = 0xC0;
|
||||
const int VK_C1 = 0xC1; // ABNT_C1 (Brazilian)
|
||||
const int VK_C2 = 0xC2; // ABNT_C2 (Brazilian)
|
||||
const int VK_OEM_4 = 0xDB;
|
||||
const int VK_OEM_5 = 0xDC;
|
||||
const int VK_OEM_6 = 0xDD;
|
||||
const int VK_OEM_7 = 0xDE;
|
||||
const int VK_OEM_8 = 0xDF;
|
||||
const int VK_OEM_AX = 0xE1;
|
||||
const int VK_OEM_102 = 0xE2;
|
||||
const int VK_OEM_RESET = 0xE9;
|
||||
const int VK_OEM_JUMP = 0xEA;
|
||||
const int VK_OEM_PA1 = 0xEB;
|
||||
const int VK_OEM_PA2 = 0xEC;
|
||||
const int VK_OEM_PA3 = 0xED;
|
||||
const int VK_OEM_WSCTRL = 0xEE;
|
||||
const int VK_OEM_CUSEL = 0xEF;
|
||||
const int VK_OEM_ATTN = 0xF0;
|
||||
const int VK_OEM_FINISH = 0xF1;
|
||||
const int VK_OEM_COPY = 0xF2;
|
||||
const int VK_OEM_AUTO = 0xF3;
|
||||
const int VK_OEM_ENLW = 0xF4;
|
||||
const int VK_OEM_BACKTAB = 0xF5;
|
||||
|
||||
|
||||
switch (key)
|
||||
{
|
||||
case Key.Cancel:
|
||||
return VK_CANCEL;
|
||||
|
||||
case Key.Back:
|
||||
return VK_BACK;
|
||||
|
||||
case Key.Tab:
|
||||
return VK_TAB;
|
||||
|
||||
case Key.Clear:
|
||||
return VK_CLEAR;
|
||||
|
||||
case Key.Return:
|
||||
return VK_RETURN;
|
||||
|
||||
case Key.Pause:
|
||||
return VK_PAUSE;
|
||||
|
||||
case Key.Capital:
|
||||
return VK_CAPITAL;
|
||||
|
||||
case Key.KanaMode:
|
||||
return VK_KANA;
|
||||
|
||||
case Key.JunjaMode:
|
||||
return VK_JUNJA;
|
||||
|
||||
case Key.FinalMode:
|
||||
return VK_FINAL;
|
||||
|
||||
case Key.KanjiMode:
|
||||
return VK_KANJI;
|
||||
|
||||
case Key.Escape:
|
||||
return VK_ESCAPE;
|
||||
|
||||
case Key.ImeConvert:
|
||||
return VK_CONVERT;
|
||||
|
||||
case Key.ImeNonConvert:
|
||||
return VK_NONCONVERT;
|
||||
|
||||
case Key.ImeAccept:
|
||||
return VK_ACCEPT;
|
||||
|
||||
case Key.ImeModeChange:
|
||||
return VK_MODECHANGE;
|
||||
|
||||
case Key.Space:
|
||||
return VK_SPACE;
|
||||
|
||||
case Key.Prior:
|
||||
return VK_PRIOR;
|
||||
|
||||
case Key.Next:
|
||||
return VK_NEXT;
|
||||
|
||||
case Key.End:
|
||||
return VK_END;
|
||||
|
||||
case Key.Home:
|
||||
return VK_HOME;
|
||||
|
||||
case Key.Left:
|
||||
return VK_LEFT;
|
||||
|
||||
case Key.Up:
|
||||
return VK_UP;
|
||||
|
||||
case Key.Right:
|
||||
return VK_RIGHT;
|
||||
|
||||
case Key.Down:
|
||||
return VK_DOWN;
|
||||
|
||||
case Key.Select:
|
||||
return VK_SELECT;
|
||||
|
||||
case Key.Print:
|
||||
return VK_PRINT;
|
||||
|
||||
case Key.Execute:
|
||||
return VK_EXECUTE;
|
||||
|
||||
case Key.Snapshot:
|
||||
return VK_SNAPSHOT;
|
||||
|
||||
case Key.Insert:
|
||||
return VK_INSERT;
|
||||
|
||||
case Key.Delete:
|
||||
return VK_DELETE;
|
||||
|
||||
case Key.Help:
|
||||
return VK_HELP;
|
||||
|
||||
case Key.D0:
|
||||
return VK_0;
|
||||
|
||||
case Key.D1:
|
||||
return VK_1;
|
||||
|
||||
case Key.D2:
|
||||
return VK_2;
|
||||
|
||||
case Key.D3:
|
||||
return VK_3;
|
||||
|
||||
case Key.D4:
|
||||
return VK_4;
|
||||
|
||||
case Key.D5:
|
||||
return VK_5;
|
||||
|
||||
case Key.D6:
|
||||
return VK_6;
|
||||
|
||||
case Key.D7:
|
||||
return VK_7;
|
||||
|
||||
case Key.D8:
|
||||
return VK_8;
|
||||
|
||||
case Key.D9:
|
||||
return VK_9;
|
||||
|
||||
case Key.A:
|
||||
return VK_A;
|
||||
|
||||
case Key.B:
|
||||
return VK_B;
|
||||
|
||||
case Key.C:
|
||||
return VK_C;
|
||||
|
||||
case Key.D:
|
||||
return VK_D;
|
||||
|
||||
case Key.E:
|
||||
return VK_E;
|
||||
|
||||
case Key.F:
|
||||
return VK_F;
|
||||
|
||||
case Key.G:
|
||||
return VK_G;
|
||||
|
||||
case Key.H:
|
||||
return VK_H;
|
||||
|
||||
case Key.I:
|
||||
return VK_I;
|
||||
|
||||
case Key.J:
|
||||
return VK_J;
|
||||
|
||||
case Key.K:
|
||||
return VK_K;
|
||||
|
||||
case Key.L:
|
||||
return VK_L;
|
||||
|
||||
case Key.M:
|
||||
return VK_M;
|
||||
|
||||
case Key.N:
|
||||
return VK_N;
|
||||
|
||||
case Key.O:
|
||||
return VK_O;
|
||||
|
||||
case Key.P:
|
||||
return VK_P;
|
||||
|
||||
case Key.Q:
|
||||
return VK_Q;
|
||||
|
||||
case Key.R:
|
||||
return VK_R;
|
||||
|
||||
case Key.S:
|
||||
return VK_S;
|
||||
|
||||
case Key.T:
|
||||
return VK_T;
|
||||
|
||||
case Key.U:
|
||||
return VK_U;
|
||||
|
||||
case Key.V:
|
||||
return VK_V;
|
||||
|
||||
case Key.W:
|
||||
return VK_W;
|
||||
|
||||
case Key.X:
|
||||
return VK_X;
|
||||
|
||||
case Key.Y:
|
||||
return VK_Y;
|
||||
|
||||
case Key.Z:
|
||||
return VK_Z;
|
||||
|
||||
case Key.LWin:
|
||||
return VK_LWIN;
|
||||
|
||||
case Key.RWin:
|
||||
return VK_RWIN;
|
||||
|
||||
case Key.Apps:
|
||||
return VK_APPS;
|
||||
|
||||
case Key.Sleep:
|
||||
return VK_SLEEP;
|
||||
|
||||
case Key.NumPad0:
|
||||
return VK_NUMPAD0;
|
||||
|
||||
case Key.NumPad1:
|
||||
return VK_NUMPAD1;
|
||||
|
||||
case Key.NumPad2:
|
||||
return VK_NUMPAD2;
|
||||
|
||||
case Key.NumPad3:
|
||||
return VK_NUMPAD3;
|
||||
|
||||
case Key.NumPad4:
|
||||
return VK_NUMPAD4;
|
||||
|
||||
case Key.NumPad5:
|
||||
return VK_NUMPAD5;
|
||||
|
||||
case Key.NumPad6:
|
||||
return VK_NUMPAD6;
|
||||
|
||||
case Key.NumPad7:
|
||||
return VK_NUMPAD7;
|
||||
|
||||
case Key.NumPad8:
|
||||
return VK_NUMPAD8;
|
||||
|
||||
case Key.NumPad9:
|
||||
return VK_NUMPAD9;
|
||||
|
||||
case Key.Multiply:
|
||||
return VK_MULTIPLY;
|
||||
|
||||
case Key.Add:
|
||||
return VK_ADD;
|
||||
|
||||
case Key.Separator:
|
||||
return VK_SEPARATOR;
|
||||
|
||||
case Key.Subtract:
|
||||
return VK_SUBTRACT;
|
||||
|
||||
case Key.Decimal:
|
||||
return VK_DECIMAL;
|
||||
|
||||
case Key.Divide:
|
||||
return VK_DIVIDE;
|
||||
|
||||
case Key.F1:
|
||||
return VK_F1;
|
||||
|
||||
case Key.F2:
|
||||
return VK_F2;
|
||||
|
||||
case Key.F3:
|
||||
return VK_F3;
|
||||
|
||||
case Key.F4:
|
||||
return VK_F4;
|
||||
|
||||
case Key.F5:
|
||||
return VK_F5;
|
||||
|
||||
case Key.F6:
|
||||
return VK_F6;
|
||||
|
||||
case Key.F7:
|
||||
return VK_F7;
|
||||
|
||||
case Key.F8:
|
||||
return VK_F8;
|
||||
|
||||
case Key.F9:
|
||||
return VK_F9;
|
||||
|
||||
case Key.F10:
|
||||
return VK_F10;
|
||||
|
||||
case Key.F11:
|
||||
return VK_F11;
|
||||
|
||||
case Key.F12:
|
||||
return VK_F12;
|
||||
|
||||
case Key.F13:
|
||||
return VK_F13;
|
||||
|
||||
case Key.F14:
|
||||
return VK_F14;
|
||||
|
||||
case Key.F15:
|
||||
return VK_F15;
|
||||
|
||||
case Key.F16:
|
||||
return VK_F16;
|
||||
|
||||
case Key.F17:
|
||||
return VK_F17;
|
||||
|
||||
case Key.F18:
|
||||
return VK_F18;
|
||||
|
||||
case Key.F19:
|
||||
return VK_F19;
|
||||
|
||||
case Key.F20:
|
||||
return VK_F20;
|
||||
|
||||
case Key.F21:
|
||||
return VK_F21;
|
||||
|
||||
case Key.F22:
|
||||
return VK_F22;
|
||||
|
||||
case Key.F23:
|
||||
return VK_F23;
|
||||
|
||||
case Key.F24:
|
||||
return VK_F24;
|
||||
|
||||
case Key.NumLock:
|
||||
return VK_NUMLOCK;
|
||||
|
||||
case Key.Scroll:
|
||||
return VK_SCROLL;
|
||||
|
||||
case Key.LeftShift:
|
||||
return VK_LSHIFT;
|
||||
|
||||
case Key.RightShift:
|
||||
return VK_RSHIFT;
|
||||
|
||||
case Key.LeftCtrl:
|
||||
return VK_LCONTROL;
|
||||
|
||||
case Key.RightCtrl:
|
||||
return VK_RCONTROL;
|
||||
|
||||
case Key.LeftAlt:
|
||||
return VK_LMENU;
|
||||
|
||||
case Key.RightAlt:
|
||||
return VK_RMENU;
|
||||
|
||||
case Key.BrowserBack:
|
||||
return VK_BROWSER_BACK;
|
||||
|
||||
case Key.BrowserForward:
|
||||
return VK_BROWSER_FORWARD;
|
||||
|
||||
case Key.BrowserRefresh:
|
||||
return VK_BROWSER_REFRESH;
|
||||
|
||||
case Key.BrowserStop:
|
||||
return VK_BROWSER_STOP;
|
||||
|
||||
case Key.BrowserSearch:
|
||||
return VK_BROWSER_SEARCH;
|
||||
|
||||
case Key.BrowserFavorites:
|
||||
return VK_BROWSER_FAVORITES;
|
||||
|
||||
case Key.BrowserHome:
|
||||
return VK_BROWSER_HOME;
|
||||
|
||||
case Key.VolumeMute:
|
||||
return VK_VOLUME_MUTE;
|
||||
|
||||
case Key.VolumeDown:
|
||||
return VK_VOLUME_DOWN;
|
||||
|
||||
case Key.VolumeUp:
|
||||
return VK_VOLUME_UP;
|
||||
|
||||
case Key.MediaNextTrack:
|
||||
return VK_MEDIA_NEXT_TRACK;
|
||||
|
||||
case Key.MediaPreviousTrack:
|
||||
return VK_MEDIA_PREV_TRACK;
|
||||
|
||||
case Key.MediaStop:
|
||||
return VK_MEDIA_STOP;
|
||||
|
||||
case Key.MediaPlayPause:
|
||||
return VK_MEDIA_PLAY_PAUSE;
|
||||
|
||||
case Key.LaunchMail:
|
||||
return VK_LAUNCH_MAIL;
|
||||
|
||||
case Key.SelectMedia:
|
||||
return VK_LAUNCH_MEDIA_SELECT;
|
||||
|
||||
case Key.LaunchApplication1:
|
||||
return VK_LAUNCH_APP1;
|
||||
|
||||
case Key.LaunchApplication2:
|
||||
return VK_LAUNCH_APP2;
|
||||
|
||||
case Key.OemSemicolon:
|
||||
return VK_OEM_1;
|
||||
|
||||
case Key.OemPlus:
|
||||
return VK_OEM_PLUS;
|
||||
|
||||
case Key.OemComma:
|
||||
return VK_OEM_COMMA;
|
||||
|
||||
case Key.OemMinus:
|
||||
return VK_OEM_MINUS;
|
||||
|
||||
case Key.OemPeriod:
|
||||
return VK_OEM_PERIOD;
|
||||
|
||||
case Key.OemQuestion:
|
||||
return VK_OEM_2;
|
||||
|
||||
case Key.OemTilde:
|
||||
return VK_OEM_3;
|
||||
|
||||
case Key.AbntC1:
|
||||
return VK_C1;
|
||||
|
||||
case Key.AbntC2:
|
||||
return VK_C2;
|
||||
|
||||
case Key.OemOpenBrackets:
|
||||
return VK_OEM_4;
|
||||
|
||||
case Key.OemPipe:
|
||||
return VK_OEM_5;
|
||||
|
||||
case Key.OemCloseBrackets:
|
||||
return VK_OEM_6;
|
||||
|
||||
case Key.OemQuotes:
|
||||
return VK_OEM_7;
|
||||
|
||||
case Key.Oem8:
|
||||
return VK_OEM_8;
|
||||
|
||||
case Key.OemBackslash:
|
||||
return VK_OEM_102;
|
||||
|
||||
case Key.ImeProcessed:
|
||||
return VK_PROCESSKEY;
|
||||
|
||||
case Key.OemAttn:
|
||||
return VK_OEM_ATTN; // VK_DBE_ALPHANUMERIC
|
||||
|
||||
case Key.OemFinish:
|
||||
return VK_OEM_FINISH; // VK_DBE_KATAKANA
|
||||
|
||||
case Key.OemCopy:
|
||||
return VK_OEM_COPY; // VK_DBE_HIRAGANA
|
||||
|
||||
case Key.OemAuto:
|
||||
return VK_OEM_AUTO; // VK_DBE_SBCSCHAR
|
||||
|
||||
case Key.OemEnlw:
|
||||
return VK_OEM_ENLW; // VK_DBE_DBCSCHAR
|
||||
|
||||
case Key.OemBackTab:
|
||||
return VK_OEM_BACKTAB; // VK_DBE_ROMAN
|
||||
|
||||
case Key.Attn:
|
||||
return VK_ATTN; // VK_DBE_NOROMAN
|
||||
|
||||
case Key.CrSel:
|
||||
return VK_CRSEL; // VK_DBE_ENTERWORDREGISTERMODE
|
||||
|
||||
case Key.ExSel:
|
||||
return VK_EXSEL; // VK_DBE_ENTERIMECONFIGMODE
|
||||
|
||||
case Key.EraseEof:
|
||||
return VK_EREOF; // VK_DBE_FLUSHSTRING
|
||||
|
||||
case Key.Play:
|
||||
return VK_PLAY; // VK_DBE_CODEINPUT
|
||||
|
||||
case Key.Zoom:
|
||||
return VK_ZOOM; // VK_DBE_NOCODEINPUT
|
||||
|
||||
case Key.NoName:
|
||||
return VK_NONAME; // VK_DBE_DETERMINESTRING
|
||||
|
||||
case Key.Pa1:
|
||||
return VK_PA1; // VK_ENTERDLGCONVERSIONMODE
|
||||
|
||||
case Key.OemClear:
|
||||
return VK_OEM_CLEAR;
|
||||
|
||||
case Key.DeadCharProcessed:
|
||||
return 0; // There is no Win32 VKey for this.
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,209 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace CefNet.Internal
|
||||
{
|
||||
internal sealed class MenuModel
|
||||
{
|
||||
private sealed class MenuModelItem
|
||||
{
|
||||
public int Command;
|
||||
public string Label;
|
||||
public CefMenuItemType Type;
|
||||
public int Group;
|
||||
public bool Visible;
|
||||
public bool Enabled;
|
||||
public bool Checked;
|
||||
public CefColor[] Colors;
|
||||
public Accelerator Accelerator;
|
||||
public MenuModel SubMenu;
|
||||
}
|
||||
|
||||
private sealed class Accelerator
|
||||
{
|
||||
public int KeyCode;
|
||||
public bool Alt;
|
||||
public bool Shift;
|
||||
public bool Ctrl;
|
||||
}
|
||||
|
||||
private MenuModelItem[] _items;
|
||||
|
||||
private MenuModel(MenuModelItem[] items)
|
||||
{
|
||||
_items = items;
|
||||
}
|
||||
|
||||
public static MenuModel FromCefMenu(CefMenuModel model)
|
||||
{
|
||||
var items = new MenuModelItem[model.Count];
|
||||
CopyItems(model, items);
|
||||
return new MenuModel(items);
|
||||
}
|
||||
|
||||
private static void CopyItems(CefMenuModel model, MenuModelItem[] dest)
|
||||
{
|
||||
for (int i = 0; i < dest.Length; i++)
|
||||
{
|
||||
var item = new MenuModelItem
|
||||
{
|
||||
Command = model.GetCommandIdAt(i),
|
||||
Label = model.GetLabelAt(i),
|
||||
Type = model.GetTypeAt(i),
|
||||
Group = model.GetGroupIdAt(i),
|
||||
Visible = model.IsVisibleAt(i),
|
||||
Enabled = model.IsEnabledAt(i),
|
||||
Checked = model.IsCheckedAt(i),
|
||||
};
|
||||
|
||||
CefColor color = default;
|
||||
item.Colors = new CefColor[(int)CefMenuColorType.Count];
|
||||
for (int j = 0; j < item.Colors.Length; j++)
|
||||
{
|
||||
item.Colors[j] = model.GetColorAt(i, (CefMenuColorType)j, ref color) ? color : default;
|
||||
}
|
||||
|
||||
int keycode = 0, alt = 0, ctrl = 0, shift = 0;
|
||||
if (model.GetAcceleratorAt(i, ref keycode, ref shift, ref ctrl, ref alt))
|
||||
{
|
||||
item.Accelerator = new Accelerator { KeyCode = keycode, Alt = alt != 0, Ctrl = ctrl != 0, Shift = shift != 0 };
|
||||
}
|
||||
|
||||
if (item.Type == CefMenuItemType.Submenu)
|
||||
{
|
||||
CefMenuModel submenu = model.GetSubMenuAt(i);
|
||||
var items = new MenuModelItem[submenu.Count];
|
||||
CopyItems(submenu, items);
|
||||
item.SubMenu = new MenuModel(items) { IsSubMenu = true };
|
||||
}
|
||||
dest[i] = item;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns true if this menu is a submenu.
|
||||
/// </summary>
|
||||
public bool IsSubMenu { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Returns the number of items in this menu.
|
||||
/// </summary>
|
||||
public int Count
|
||||
{
|
||||
get { return _items.Length; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the command id at the specified |index| or -1 if not found due to
|
||||
/// invalid range or the index being a separator.
|
||||
/// </summary>
|
||||
public int GetCommandIdAt(int index)
|
||||
{
|
||||
return _items[index].Command;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the label at the specified |index| or NULL if not found due to
|
||||
/// invalid range or the index being a separator.
|
||||
/// The resulting string must be freed by calling cef_string_userfree_free().
|
||||
/// </summary>
|
||||
public string GetLabelAt(int index)
|
||||
{
|
||||
return _items[index].Label;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the item type at the specified |index|.
|
||||
/// </summary>
|
||||
public CefMenuItemType GetTypeAt(int index)
|
||||
{
|
||||
return _items[index].Type;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the group id at the specified |index| or -1 if invalid.
|
||||
/// </summary>
|
||||
public int GetGroupIdAt(int index)
|
||||
{
|
||||
return _items[index].Group;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the submenu at the specified |index| or NULL if invalid.
|
||||
/// </summary>
|
||||
public MenuModel GetSubMenuAt(int index)
|
||||
{
|
||||
return _items[index].SubMenu;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns true if the specified |index| is visible.
|
||||
/// </summary>
|
||||
public bool IsVisibleAt(int index)
|
||||
{
|
||||
return _items[index].Visible;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns true if the specified |index| is enabled.
|
||||
/// </summary>
|
||||
public bool IsEnabledAt(int index)
|
||||
{
|
||||
return _items[index].Enabled;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns true if the specified |index| is checked. Only applies to check
|
||||
/// and radio items.
|
||||
/// </summary>
|
||||
public bool IsCheckedAt(int index)
|
||||
{
|
||||
return _items[index].Checked;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns true if the specified |index| has a keyboard accelerator
|
||||
/// assigned.
|
||||
/// </summary>
|
||||
public bool HasAcceleratorAt(int index)
|
||||
{
|
||||
return _items[index].Accelerator != null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Retrieves the keyboard accelerator for the specified |index|. Returns true on success.
|
||||
/// </summary>
|
||||
public bool GetAcceleratorAt(int index, out int keyCode, out bool shift, out bool ctrl, out bool alt)
|
||||
{
|
||||
Accelerator accelerator = _items[index].Accelerator;
|
||||
if (accelerator == null)
|
||||
{
|
||||
keyCode = 0;
|
||||
shift = false;
|
||||
ctrl = false;
|
||||
alt = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
keyCode = accelerator.KeyCode;
|
||||
shift = accelerator.Shift;
|
||||
ctrl = accelerator.Ctrl;
|
||||
alt = accelerator.Alt;
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns in |color| the color that was explicitly set for |command_id| and
|
||||
/// |color_type|. Specify an |index| value of -1 to return the default color in
|
||||
/// |color|. If a color was not set then 0 will be returned in |color|. Returns
|
||||
/// true on success.
|
||||
/// </summary>
|
||||
public bool GetColorAt(int index, CefMenuColorType colorType, out CefColor color)
|
||||
{
|
||||
color = _items[index].Colors[(int)colorType];
|
||||
return color != 0;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,234 +0,0 @@
|
||||
using System;
|
||||
using System.Buffers;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using Avalonia;
|
||||
using Avalonia.Media;
|
||||
using Avalonia.Media.Imaging;
|
||||
using Avalonia.Platform;
|
||||
using CefNet.Avalonia;
|
||||
|
||||
namespace CefNet.Internal
|
||||
{
|
||||
public sealed class OffscreenGraphics
|
||||
{
|
||||
private class PixelBuffer : IDisposable
|
||||
{
|
||||
public byte[] DIB;
|
||||
|
||||
private List<CefRect> _dirtyRects = new List<CefRect>();
|
||||
|
||||
public int Width;
|
||||
|
||||
public int Height;
|
||||
|
||||
public WriteableBitmap Surface;
|
||||
|
||||
public PixelBuffer(int width, int height)
|
||||
{
|
||||
this.Width = width;
|
||||
this.Height = height;
|
||||
this.DIB = ArrayPool<byte>.Shared.Rent(width * height * 4);
|
||||
}
|
||||
|
||||
~PixelBuffer()
|
||||
{
|
||||
Dispose(false);
|
||||
}
|
||||
|
||||
private void Dispose(bool disposing)
|
||||
{
|
||||
byte[] buffer = Interlocked.Exchange(ref DIB, null);
|
||||
if (buffer != null)
|
||||
{
|
||||
ArrayPool<byte>.Shared.Return(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Dispose(true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
public int Stride
|
||||
{
|
||||
get { return Width * 4; }
|
||||
}
|
||||
|
||||
public int Size
|
||||
{
|
||||
get
|
||||
{
|
||||
return Width * Height * 4;
|
||||
}
|
||||
}
|
||||
|
||||
public void AddDirtyRects(CefRect[] dirtyRects)
|
||||
{
|
||||
_dirtyRects.AddRange(dirtyRects);
|
||||
}
|
||||
|
||||
//public Int32Rect GetDirtyRectangle()
|
||||
//{
|
||||
// if (_dirtyRects.Count == 0)
|
||||
// return new Int32Rect();
|
||||
// CefRect r = _dirtyRects[0];
|
||||
// Int32Rect dirtyRect = new Int32Rect(r.X, r.Y, r.Width, r.Height);
|
||||
// for (int i = 1; i < _dirtyRects.Count; i++)
|
||||
// {
|
||||
// dirtyRect.Union(_dirtyRects[i]);
|
||||
// }
|
||||
// return dirtyRect;
|
||||
//}
|
||||
|
||||
public void ClearDirtyRectangle()
|
||||
{
|
||||
_dirtyRects.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
private PixelBuffer ViewPixels;
|
||||
private PixelBuffer PopupPixels;
|
||||
|
||||
private readonly object _syncRoot;
|
||||
private CefRect _bounds;
|
||||
private CefRect _popupBounds;
|
||||
|
||||
public OffscreenGraphics()
|
||||
{
|
||||
_syncRoot = new object();
|
||||
_bounds = new CefRect(0, 0, 1, 1);
|
||||
}
|
||||
|
||||
public static DpiScale DpiScale { get; set; } = new DpiScale(1, 1);
|
||||
|
||||
public void SetLocation(int x, int y)
|
||||
{
|
||||
_bounds.X = x;
|
||||
_bounds.Y = y;
|
||||
}
|
||||
|
||||
public bool SetSize(int width, int height)
|
||||
{
|
||||
width = Math.Max(width, 1);
|
||||
height = Math.Max(height, 1);
|
||||
_bounds.Width = width;
|
||||
_bounds.Height = height;
|
||||
|
||||
lock (_syncRoot)
|
||||
{
|
||||
return ViewPixels == null || ViewPixels.Width != width || ViewPixels.Height != height;
|
||||
}
|
||||
}
|
||||
|
||||
public CefRect GetBounds()
|
||||
{
|
||||
return _bounds;
|
||||
}
|
||||
|
||||
public void Draw(CefPaintEventArgs e)
|
||||
{
|
||||
lock (_syncRoot)
|
||||
{
|
||||
PixelBuffer pixelBuffer;
|
||||
if (e.PaintElementType == CefPaintElementType.View)
|
||||
{
|
||||
if (ViewPixels == null || ViewPixels.Width != e.Width || ViewPixels.Height != e.Height)
|
||||
{
|
||||
if (ViewPixels != null)
|
||||
ViewPixels.Dispose();
|
||||
|
||||
ViewPixels = new PixelBuffer(e.Width, e.Height);
|
||||
}
|
||||
pixelBuffer = ViewPixels;
|
||||
}
|
||||
else if(e.PaintElementType == CefPaintElementType.Popup)
|
||||
{
|
||||
if (PopupPixels == null || PopupPixels.Width != e.Width || PopupPixels.Height != e.Height)
|
||||
{
|
||||
if (PopupPixels != null)
|
||||
PopupPixels.Dispose();
|
||||
PopupPixels = new PixelBuffer(e.Width, e.Height);
|
||||
}
|
||||
pixelBuffer = PopupPixels;
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Marshal.Copy(e.Buffer, pixelBuffer.DIB, 0, pixelBuffer.Size);
|
||||
pixelBuffer.AddDirtyRects(e.DirtyRects);
|
||||
}
|
||||
}
|
||||
|
||||
public unsafe void Render(DrawingContext drawingContext)
|
||||
{
|
||||
lock (_syncRoot)
|
||||
{
|
||||
if (ViewPixels != null)
|
||||
{
|
||||
PixelSize pixelSize;
|
||||
WriteableBitmap surface;
|
||||
|
||||
surface = GetSurface(ViewPixels);
|
||||
pixelSize = surface.PixelSize;
|
||||
drawingContext.DrawImage(surface, new Rect(0, 0, pixelSize.Width, pixelSize.Height), new Rect(surface.Size));
|
||||
|
||||
PixelBuffer pixelBuffer = PopupPixels;
|
||||
if (pixelBuffer == null)
|
||||
return;
|
||||
|
||||
surface = GetSurface(pixelBuffer);
|
||||
Size size = surface.Size;
|
||||
pixelSize = surface.PixelSize;
|
||||
drawingContext.DrawImage(surface,
|
||||
new Rect(0, 0, pixelSize.Width, pixelSize.Height),
|
||||
new Rect(_popupBounds.X, _popupBounds.Y, size.Width, size.Height));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private WriteableBitmap GetSurface(PixelBuffer pixelBuffer)
|
||||
{
|
||||
if (!Monitor.IsEntered(_syncRoot))
|
||||
throw new InvalidOperationException();
|
||||
|
||||
WriteableBitmap surface = pixelBuffer.Surface;
|
||||
if (surface is null || surface.PixelSize != new PixelSize(pixelBuffer.Width, pixelBuffer.Height))
|
||||
{
|
||||
surface?.Dispose();
|
||||
surface = new WriteableBitmap(new PixelSize(pixelBuffer.Width, pixelBuffer.Height), OffscreenGraphics.DpiScale.Dpi, PixelFormat.Bgra8888, AlphaFormat.Premul);
|
||||
pixelBuffer.Surface = surface;
|
||||
}
|
||||
|
||||
using (ILockedFramebuffer frameBuffer = surface.Lock())
|
||||
{
|
||||
Marshal.Copy(pixelBuffer.DIB, 0, frameBuffer.Address, pixelBuffer.Size);
|
||||
pixelBuffer.ClearDirtyRectangle();
|
||||
}
|
||||
return surface;
|
||||
}
|
||||
|
||||
public void SetPopup(PopupShowEventArgs e)
|
||||
{
|
||||
if (e.Visible)
|
||||
{
|
||||
_popupBounds = e.Bounds;
|
||||
}
|
||||
else
|
||||
{
|
||||
lock (_syncRoot)
|
||||
{
|
||||
PopupPixels?.Dispose();
|
||||
PopupPixels = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,91 +0,0 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Runtime.ConstrainedExecution;
|
||||
using System.Runtime.InteropServices;
|
||||
using CefNet.WinApi;
|
||||
|
||||
namespace CefNet.Internal
|
||||
{
|
||||
|
||||
internal delegate IntPtr WindowsWindowProcDelegate(IntPtr hwnd, int message, IntPtr wParam, IntPtr lParam, ref bool handled);
|
||||
|
||||
internal sealed class WindowsHwndSource : CriticalFinalizerObject, IDisposable
|
||||
{
|
||||
private delegate IntPtr WindowProc(IntPtr hwnd, int message, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
|
||||
private bool _disposed;
|
||||
private IntPtr hWndProcHook;
|
||||
private readonly WindowProc fnWndProcHook;
|
||||
|
||||
|
||||
public static WindowsHwndSource FromHwnd(IntPtr hwnd)
|
||||
{
|
||||
const int GWLP_WNDPROC = -4;
|
||||
|
||||
uint tid = NativeMethods.GetWindowThreadProcessId(hwnd, IntPtr.Zero);
|
||||
if (tid == 0)
|
||||
throw new Win32Exception(Marshal.GetLastWin32Error());
|
||||
|
||||
var source = new WindowsHwndSource(hwnd);
|
||||
source.hWndProcHook = NativeMethods.SetWindowLong(hwnd, GWLP_WNDPROC, Marshal.GetFunctionPointerForDelegate(source.fnWndProcHook));
|
||||
if (source.hWndProcHook == IntPtr.Zero)
|
||||
throw new Win32Exception(Marshal.GetLastWin32Error());
|
||||
|
||||
return source;
|
||||
}
|
||||
|
||||
private WindowsHwndSource(IntPtr hwnd)
|
||||
{
|
||||
hWndProcHook = IntPtr.Zero;
|
||||
this.Handle = hwnd;
|
||||
fnWndProcHook = new WindowProc(WndProcHook);
|
||||
}
|
||||
|
||||
~WindowsHwndSource()
|
||||
{
|
||||
Dispose(false);
|
||||
}
|
||||
|
||||
private void Dispose(bool disposing)
|
||||
{
|
||||
if (_disposed)
|
||||
return;
|
||||
|
||||
if (hWndProcHook != IntPtr.Zero)
|
||||
{
|
||||
const int GWLP_WNDPROC = -4;
|
||||
NativeMethods.SetWindowLong(this.Handle, GWLP_WNDPROC, hWndProcHook);
|
||||
}
|
||||
_disposed = true;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Dispose(true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
public IntPtr Handle { get; }
|
||||
|
||||
public WindowsWindowProcDelegate WndProcCallback { get; set; }
|
||||
|
||||
private unsafe IntPtr WndProcHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam)
|
||||
{
|
||||
IntPtr retval = IntPtr.Zero;
|
||||
WindowsWindowProcDelegate wndproc = this.WndProcCallback;
|
||||
if (wndproc != null)
|
||||
{
|
||||
bool handled = false;
|
||||
retval = wndproc(hwnd, msg, wParam, lParam, ref handled);
|
||||
if (handled)
|
||||
return retval;
|
||||
}
|
||||
return NativeMethods.CallWindowProc(hWndProcHook, hwnd, msg, wParam, lParam);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
using Avalonia.Interactivity;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace CefNet.Avalonia
|
||||
{
|
||||
/// <summary>
|
||||
/// Provides data for the <see cref="WebView.StartDragging"/> event.
|
||||
/// </summary>
|
||||
public class StartDraggingEventArgs : RoutedEventArgs
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="StartDraggingEventArgs"/> class.
|
||||
/// </summary>
|
||||
/// <param name="source"></param>
|
||||
/// <param name="data">The data associated with this event.</param>
|
||||
/// <param name="allowedOps">Drag-and-drop operations which allowed by the source of the drag event.</param>
|
||||
/// <param name="x">The X-location in screen coordinates.</param>
|
||||
/// <param name="y">The Y-location in screen coordinates.</param>
|
||||
public StartDraggingEventArgs(CefDragData data, CefDragOperationsMask allowedOps, int x, int y)
|
||||
: base(WebView.StartDraggingEvent)
|
||||
{
|
||||
this.Data = data;
|
||||
this.AllowedEffects = allowedOps;
|
||||
this.X = x;
|
||||
this.Y = y;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The contextual information about the dragged content.
|
||||
/// </summary>
|
||||
public CefDragData Data { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets which drag-and-drop operations are allowed by the originator (or source) of the drag event.
|
||||
/// </summary>
|
||||
public CefDragOperationsMask AllowedEffects { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the X-location of the mouse pointer in screen coordinates.
|
||||
/// </summary>
|
||||
public int X { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the Y-location of the mouse pointer in screen coordinates.
|
||||
/// </summary>
|
||||
public int Y { get; }
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CefNet.WinApi
|
||||
{
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
internal struct CWPSTRUCT
|
||||
{
|
||||
public IntPtr lParam;
|
||||
public IntPtr wParam;
|
||||
public int message;
|
||||
public IntPtr hwnd;
|
||||
}
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
|
||||
namespace CefNet.WinApi
|
||||
{
|
||||
static class NativeMethods
|
||||
{
|
||||
[DllImport("user32.dll")]
|
||||
public static extern IntPtr GetKeyboardLayout(uint idThread);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
public static extern IntPtr ActivateKeyboardLayout(IntPtr hkl, int flags);
|
||||
|
||||
[DllImport("user32.dll", EntryPoint = "VkKeyScanW", CharSet = CharSet.Unicode, SetLastError = true)]
|
||||
public static extern ushort VkKeyScan(char ch);
|
||||
|
||||
public static IntPtr SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong)
|
||||
{
|
||||
if (IntPtr.Size == 8)
|
||||
return SetWindowLongPtr64(hWnd, nIndex, dwNewLong);
|
||||
else
|
||||
return new IntPtr(SetWindowLong32(hWnd, nIndex, dwNewLong.ToInt32()));
|
||||
}
|
||||
|
||||
[DllImport("user32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
private static extern int SetWindowLong32(IntPtr hWnd, int nIndex, int dwNewLong);
|
||||
|
||||
[DllImport("user32.dll", EntryPoint = "SetWindowLongPtr", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
private static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Auto)]
|
||||
public static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true)]
|
||||
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr pPid);
|
||||
|
||||
[DllImport("Dwmapi.dll", CharSet = CharSet.Auto)]
|
||||
public static unsafe extern int DwmGetWindowAttribute(IntPtr hwnd, DWMWINDOWATTRIBUTE attribute, void* value, int size);
|
||||
|
||||
[DllImport("Dwmapi.dll", CharSet = CharSet.Auto, PreserveSig = false)]
|
||||
public static extern bool DwmIsCompositionEnabled();
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
|
||||
namespace CefNet.WinApi
|
||||
{
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
internal struct WINDOWPOS
|
||||
{
|
||||
public IntPtr hwnd;
|
||||
public IntPtr hwndInsertAfter;
|
||||
public int x;
|
||||
public int y;
|
||||
public int cx;
|
||||
public int cy;
|
||||
public int flags;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
namespace CefNet.WinApi
|
||||
{
|
||||
internal enum DWMWINDOWATTRIBUTE
|
||||
{
|
||||
NCRenderingEnabled = 1,
|
||||
NCRenderingPolicy,
|
||||
TransitionsForceDisabled,
|
||||
AllowNCPaint,
|
||||
CaptionButtonBounds,
|
||||
NonClientRtlLayout,
|
||||
ForceIconicRepresentation,
|
||||
Flip3DPolicy,
|
||||
ExtendedFrameBounds,
|
||||
HasIconicBitmap,
|
||||
DisallowPeek,
|
||||
ExcludedFromPeek,
|
||||
ExceludedFromPeek,
|
||||
Cloak,
|
||||
Cloaked,
|
||||
FreezeRepresentation
|
||||
}
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
#if AVALONIA
|
||||
using Avalonia.Interactivity;
|
||||
#elif WPF
|
||||
using System.Windows;
|
||||
#endif
|
||||
|
||||
#if AVALONIA
|
||||
namespace CefNet.Avalonia
|
||||
#elif WPF
|
||||
namespace CefNet.Wpf
|
||||
#endif
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents PDF printing results.
|
||||
/// </summary>
|
||||
public sealed class PdfPrintFinishedRoutedEventArgs : RoutedEventArgs, IPdfPrintFinishedEventArgs
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="PdfPrintFinishedEventArgs"/> class.
|
||||
/// </summary>
|
||||
/// <param name="path">The path to PDF file.</param>
|
||||
/// <param name="success">A value which indicates that the PDF printing completed successfully.</param>
|
||||
public PdfPrintFinishedRoutedEventArgs(string path, bool success)
|
||||
: base(WebView.PdfPrintFinishedEvent)
|
||||
{
|
||||
this.Path = path;
|
||||
this.Success = success;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the path to PDF file.
|
||||
/// </summary>
|
||||
public string Path { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value which indicates that the PDF printing completed successfully.
|
||||
/// </summary>
|
||||
/// <value></value>
|
||||
public bool Success { get; }
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,81 +0,0 @@
|
||||
#if AVALONIA
|
||||
using Avalonia.Interactivity;
|
||||
#elif WPF
|
||||
using System.Windows;
|
||||
#endif
|
||||
using System;
|
||||
|
||||
#if AVALONIA
|
||||
namespace CefNet.Avalonia
|
||||
#elif WPF
|
||||
namespace CefNet.Wpf
|
||||
#endif
|
||||
{
|
||||
/// <summary>
|
||||
/// Event args for the <see cref="IChromiumWebView.ScriptDialogOpening"/> event.
|
||||
/// </summary>
|
||||
public sealed class ScriptDialogOpeningRoutedEventArgs : RoutedEventArgs, IScriptDialogOpeningEventArgs
|
||||
{
|
||||
private readonly ScriptDialogDeferral _callback;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ScriptDialogOpeningEventArgs"/> class.
|
||||
/// </summary>
|
||||
/// <param name="originUrl">The URI of the page that requested the dialog box.</param>
|
||||
/// <param name="kind">The kind of JavaScript dialog box.</param>
|
||||
/// <param name="message">The message of the dialog box.</param>
|
||||
/// <param name="defaultText">The default value to use for the result of the prompt JavaScript function.</param>
|
||||
/// <param name="callback"></param>
|
||||
public ScriptDialogOpeningRoutedEventArgs(string originUrl, ScriptDialogKind kind, string message, string defaultText, ScriptDialogDeferral callback)
|
||||
: base(WebView.ScriptDialogOpeningEvent)
|
||||
{
|
||||
this.Uri = Uri.TryCreate(originUrl, UriKind.Absolute, out Uri uri) ? uri : null;
|
||||
this.Kind = kind;
|
||||
this.Message = message;
|
||||
this.DefaultText = defaultText;
|
||||
_callback = callback;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ScriptDialogOpeningEventArgs"/> class.
|
||||
/// </summary>
|
||||
/// <param name="kind">The kind of JavaScript dialog box.</param>
|
||||
/// <param name="message">The message of the dialog box.</param>
|
||||
/// <param name="reload">Indicates that the event is fired before page reloading.</param>
|
||||
/// <param name="callback"></param>
|
||||
public ScriptDialogOpeningRoutedEventArgs(string message, bool reload, ScriptDialogDeferral callback)
|
||||
: base(WebView.ScriptDialogOpeningEvent)
|
||||
{
|
||||
this.Uri = null;
|
||||
this.Kind = ScriptDialogKind.BeforeUnload;
|
||||
this.Message = message;
|
||||
this.IsReload = reload;
|
||||
_callback = callback;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public Uri Uri { get; }
|
||||
|
||||
/// <inheritdoc/>
|
||||
public ScriptDialogKind Kind { get; }
|
||||
|
||||
/// <inheritdoc/>
|
||||
public string Message { get; }
|
||||
|
||||
/// <inheritdoc/>
|
||||
public string DefaultText { get; }
|
||||
|
||||
/// <inheritdoc/>
|
||||
public bool Suppress { get; set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool IsReload { get; set; }
|
||||
|
||||
/// <inheritdoc/>
|
||||
public ScriptDialogDeferral GetDeferral()
|
||||
{
|
||||
this.Handled = true;
|
||||
return _callback;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
#if AVALONIA
|
||||
using Avalonia.Interactivity;
|
||||
#elif WPF
|
||||
using System.Windows;
|
||||
#endif
|
||||
|
||||
#if AVALONIA
|
||||
namespace CefNet.Avalonia
|
||||
#elif WPF
|
||||
namespace CefNet.Wpf
|
||||
#endif
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents find results.
|
||||
/// </summary>
|
||||
public sealed class TextFoundRoutedEventArgs : RoutedEventArgs, ITextFoundEventArgs
|
||||
{
|
||||
public TextFoundRoutedEventArgs(int identifier, int count, CefRect selectionRect, int index, bool finalUpdate)
|
||||
: base(WebView.TextFoundEvent)
|
||||
{
|
||||
this.ID = identifier;
|
||||
this.Count = count;
|
||||
this.SelectionRect = selectionRect;
|
||||
this.Index = index;
|
||||
this.FinalUpdate = finalUpdate;
|
||||
}
|
||||
|
||||
public int ID { get; }
|
||||
|
||||
public int Index { get; }
|
||||
|
||||
public int Count { get; }
|
||||
|
||||
public CefRect SelectionRect { get; }
|
||||
|
||||
public bool FinalUpdate { get; }
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2020 CefNet
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -1,116 +0,0 @@
|
||||
# 前言
|
||||
|
||||
Steam++项目创建于2018年5月8日,不过并不是耗时三年才做出来,之前一直由于软软(软件原作者)的工作原因,并没有多少空闲时间,直到去年中旬软软辞职了,才开始猛肝。
|
||||
|
||||
去年年底发布了Steam++的第一个版本,受到了其乐广大用户的喜爱,并有了高达数百位网友的赞助支持。在此动力下,一直一个人更新维护到今年2月份。之后又找来几位朋友一起全职合作开发,并创立了我们自己的公司来进行运营这一产品。
|
||||
|
||||
在每人每天近16小时的高强度爆肝下,我们使用了最新的技术、最新的框架,将Steam++原先的代码全部重写,重新制作了UI。于是乎,Steam++2.0崭新出炉了。
|
||||
|
||||
Steam++目前处于一个完全开源的状态,所以对于软件报毒可以不用担心安全问题。我们也制作了自己的产品[官网](https://www.steampp.net),大家可以去官网下载到我们的工具。
|
||||
|
||||
# Steam++工具箱
|
||||
|
||||
## 更新内容
|
||||
|
||||
### 2.3.0
|
||||
```
|
||||
1. 改进 端口被占用检测进程名
|
||||
2. 修复 部分 Toast 没有正确显示
|
||||
3. 新增 账号注销功能
|
||||
4. 改进 hosts 文件写入无权操作时显示的错误文本
|
||||
5. 新增 快速登录后可绑定手机号
|
||||
6. 新增 解绑快速登录账号
|
||||
7. 新增 隐藏库存游戏
|
||||
8. 新增 游戏功能-无边框窗口化
|
||||
9. 新增 关于-更新日志
|
||||
10. 新增 令牌加密设置,现在新增令牌默认将不启用本机加密
|
||||
11. 修复 非正常退出程序时导致残留进程且无法启动程序
|
||||
12. 改进 不再写入 C:\Users\用户名\AppData\Local 目录
|
||||
13. 修复 文本框中某些符号可能无法正确输入
|
||||
14. 改进 令牌排序上移下移
|
||||
15. 新增 令牌导入导出
|
||||
16. 新增 游戏时长挂机功能
|
||||
17. 新增 Microsoft 账号快速登录与绑定
|
||||
18. 新增 社区加速 hCaptcha 验证码 / EPIC 验证码 / artstation / v2ex
|
||||
19. 修复 社区加速 discord 更新下载
|
||||
|
||||
```
|
||||
|
||||
|
||||
## 工具介绍
|
||||
|
||||
「Steam++」是一个包含多种Steam工具功能的工具箱,所有功能完全免费,开源发布于Github,如果您对发布的二进制文件不放心,可以自行下载源码编译运行。
|
||||
|
||||
此工具的大部分功能都是需要您下载安装Steam才能使用。
|
||||
|
||||
工具预计将整合进大部分常用的Steam相关工具,并且尽力做到比原工具更好用。
|
||||
|
||||
软件截图
|
||||
[hide]
|
||||
[attachimg]1228394[/attachimg]
|
||||
[attachimg]1228395[/attachimg]
|
||||
[attachimg]1228396[/attachimg]
|
||||
[attachimg]1228397[/attachimg]
|
||||
[/hide]
|
||||
|
||||
## 核心功能
|
||||
|
||||
|
||||
### 1. 通过本地反代理Steam的社区等网页使其能正常访问
|
||||
|
||||
功能使用Titanium-Web-Proxy开源项目进行本地反代,相比SteamCommunity302工具具有更快的启动速度。让用户能够连接上诸如Steam社区(个人资料页)、Discord语音聊天、Twitch直播观看、Origin下载加速、谷歌验证码、Pixiv图片等。
|
||||
[attachimg]1228388[/attachimg]
|
||||
|
||||
### 2. 快速切换当前PC已经记住登陆的Steam账号
|
||||
|
||||
该功能是读取Steam路径下存储的本地用户登录记录直接展示操作,可以多账号切换无需重新输入密码和令牌。如果您的ip地址更换,会导致登陆状态失效。在Steam++2.0新版本支持了动态头像。
|
||||
[attachimg]1228389[/attachimg]
|
||||
|
||||
### 3. Steam游戏的成就统计管理功能
|
||||
|
||||
能够读取任何游戏的成就信息(包括隐藏成就),并且能进行成就修改,包括成就解锁以及成就反解锁,还能够修改成就统计信息
|
||||
|
||||
参考SAM(SteamAchievementManager)进行二次开发,修复了成就语言有中文却依然是英文成就信息的BUG,修改了游戏列表的加载和操作易用性。
|
||||
|
||||
注意:滥用成就管理功能可能会导致开发者封禁!
|
||||
[attachimg]1228390[/attachimg]
|
||||
|
||||
### 4. Steam本地两步身份验证器
|
||||
|
||||
该功能能够将Steam手机令牌储存到您的电脑中,并能够进行与手机端一样的操作。
|
||||
|
||||
不仅能查看手机令牌,还能进行交易报价确认,并且能一键全部确认。
|
||||
|
||||
功能参考WinAuth开发,功能类似的软件有WinAuth、SteamDesktopAuthenticator。
|
||||
[attachimg]1228391[/attachimg]
|
||||
|
||||
本地令牌交易市场报价确认
|
||||
[attachimg]1262615[/attachimg]
|
||||
|
||||
### 5. Steam内置浏览器脚本注入
|
||||
通过反代加速功能将js脚本内置插入了Steam客户端内的浏览器,达到了与油猴类似的效果。目前2.0.0.6版本新增了脚本工坊,可以从我们的服务器上下载到已经兼容的脚本。我们也会不断添加新的脚本,同时也会对旧的脚本进行维护。
|
||||
|
||||
### 6. 更多的游戏工具功能
|
||||
支持各种老游戏无边框窗口化等等
|
||||
|
||||
### 6. 更新计划(画饼时间到)
|
||||
我们预计会在6月份将推出本地挂卡、挂时长功能。并且同步推出iOS、安卓端App,用户可以利用手机查看多个账号的令牌,一键确认上架,并且支持手机挂卡。
|
||||
|
||||
#### 并且,以上功能全部免费!
|
||||
|
||||
------
|
||||
|
||||
|
||||
## 运行环境
|
||||
|
||||
> 程序使用C# 在 .NET 6.0环境下开发,新版采用独立部署编译,不需要运行环境也可以运行)。
|
||||
|
||||
## 下载
|
||||
> [官网](https://steampp.net/)
|
||||
> [Github](https://github.com/rmbadmin/SteamTools/releases)
|
||||
> 分流下载:
|
||||
> [hide]
|
||||
> [蓝奏云](https://cliencer.lanzous.com/b0165duja)
|
||||
> 提取码:1234
|
||||
> [/hide]
|
||||
使用过程中可能遇到windows defender误报,您可以选择添加信任。
|
||||
@@ -1,32 +0,0 @@
|
||||
1. 修复 添加令牌时引发的闪退
|
||||
2. CLR 升级至 .NET 6 Preview 4
|
||||
3. 64 位程序支持,从此版本开始不再提供 32 位程序支持
|
||||
4. CEF 升级至 90.6.3
|
||||
5. 改进 程序目录结构,所有相关 dll 将放入 bin 文件夹中
|
||||
6. 新增 全新的托盘菜单
|
||||
7. 改进 隐藏游戏列表与挂机游戏列表实时刷新
|
||||
8. 新增 JumpList 菜单切换账号
|
||||
9. 修复 Win7 中右上角按钮样式错误
|
||||
10. 改进 缓存获取加速项目数据,避免失败时无数据
|
||||
11. 修复 手动检查更新时有概率出现两个新版本窗口
|
||||
12. 改进 未使用社区加速时退出程序不再清理 hosts 文件
|
||||
|
||||
| File | Checksum (SHA256) |
|
||||
| ---- | ---- |
|
||||
| Steam++_win_x64_v2.4.0.7z | SHA256 |
|
||||
| Steam++_win_x64_v2.4.0.exe | SHA256 |
|
||||
| Steam++_win_x64_v2.4.0.msix | SHA256 |
|
||||
| Steam++_win_arm64_v2.4.0.7z | SHA256 |
|
||||
| Steam++_win_arm64_v2.4.0.exe | SHA256 |
|
||||
| Steam++_win_arm64_v2.4.0.msix | SHA256 |
|
||||
| Steam++_linux_x64_v2.4.0.7z | SHA256 |
|
||||
| Steam++_linux_x64_v2.4.0.deb | SHA256 |
|
||||
| Steam++_macos_x64_v2.4.0.dmg | SHA256 |
|
||||
| Steam++_macos_arm64_v2.4.0.dmg | SHA256 |
|
||||
| Steam++_android_v2.4.0.apk | SHA256 |
|
||||
| Steam++_android_arm64_v2.4.0.apk | SHA256 |
|
||||
| Steam++_android_arm_v2.4.0.apk | SHA256 |
|
||||
|
||||
***
|
||||
|
||||
由于程序体积较大,推荐从 [官网 https://steampp.net](https://steampp.net) 中下载
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc.--><g fill="#3ddc84"><path d="M420.55,301.93a24,24,0,1,1,24-24,24,24,0,0,1-24,24m-265.1,0a24,24,0,1,1,24-24,24,24,0,0,1-24,24m273.7-144.48,47.94-83a10,10,0,1,0-17.27-10h0l-48.54,84.07a301.25,301.25,0,0,0-246.56,0L116.18,64.45a10,10,0,1,0-17.27,10h0l47.94,83C64.53,202.22,8.24,285.55,0,384H576c-8.24-98.45-64.54-181.78-146.85-226.55"/></g></svg>
|
||||
|
After Width: | Height: | Size: 570 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc.--><g fill="#A2AAAD"><path d="M318.7 268.7c-.2-36.7 16.4-64.4 50-84.8-18.8-26.9-47.2-41.7-84.7-44.6-35.5-2.8-74.3 20.7-88.5 20.7-15 0-49.4-19.7-76.4-19.7C63.3 141.2 4 184.8 4 273.5q0 39.3 14.4 81.2c12.8 36.7 59 126.7 107.2 125.2 25.2-.6 43-17.9 75.8-17.9 31.8 0 48.3 17.9 76.4 17.9 48.6-.7 90.4-82.5 102.6-119.3-65.2-30.7-61.7-90-61.7-91.9zm-56.6-164.2c27.3-32.4 24.8-61.9 24-72.5-24.1 1.4-52 16.4-67.9 34.9-17.5 19.8-27.8 44.3-25.6 71.9 26.1 2 49.9-11.4 69.5-34.3z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 704 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc.--><g fill="#E95420"><path d="M220.8 123.3c1 .5 1.8 1.7 3 1.7 1.1 0 2.8-.4 2.9-1.5.2-1.4-1.9-2.3-3.2-2.9-1.7-.7-3.9-1-5.5-.1-.4.2-.8.7-.6 1.1.3 1.3 2.3 1.1 3.4 1.7zm-21.9 1.7c1.2 0 2-1.2 3-1.7 1.1-.6 3.1-.4 3.5-1.6.2-.4-.2-.9-.6-1.1-1.6-.9-3.8-.6-5.5.1-1.3.6-3.4 1.5-3.2 2.9.1 1 1.8 1.5 2.8 1.4zM420 403.8c-3.6-4-5.3-11.6-7.2-19.7-1.8-8.1-3.9-16.8-10.5-22.4-1.3-1.1-2.6-2.1-4-2.9-1.3-.8-2.7-1.5-4.1-2 9.2-27.3 5.6-54.5-3.7-79.1-11.4-30.1-31.3-56.4-46.5-74.4-17.1-21.5-33.7-41.9-33.4-72C311.1 85.4 315.7.1 234.8 0 132.4-.2 158 103.4 156.9 135.2c-1.7 23.4-6.4 41.8-22.5 64.7-18.9 22.5-45.5 58.8-58.1 96.7-6 17.9-8.8 36.1-6.2 53.3-6.5 5.8-11.4 14.7-16.6 20.2-4.2 4.3-10.3 5.9-17 8.3s-14 6-18.5 14.5c-2.1 3.9-2.8 8.1-2.8 12.4 0 3.9.6 7.9 1.2 11.8 1.2 8.1 2.5 15.7.8 20.8-5.2 14.4-5.9 24.4-2.2 31.7 3.8 7.3 11.4 10.5 20.1 12.3 17.3 3.6 40.8 2.7 59.3 12.5 19.8 10.4 39.9 14.1 55.9 10.4 11.6-2.6 21.1-9.6 25.9-20.2 12.5-.1 26.3-5.4 48.3-6.6 14.9-1.2 33.6 5.3 55.1 4.1.6 2.3 1.4 4.6 2.5 6.7v.1c8.3 16.7 23.8 24.3 40.3 23 16.6-1.3 34.1-11 48.3-27.9 13.6-16.4 36-23.2 50.9-32.2 7.4-4.5 13.4-10.1 13.9-18.3.4-8.2-4.4-17.3-15.5-29.7zM223.7 87.3c9.8-22.2 34.2-21.8 44-.4 6.5 14.2 3.6 30.9-4.3 40.4-1.6-.8-5.9-2.6-12.6-4.9 1.1-1.2 3.1-2.7 3.9-4.6 4.8-11.8-.2-27-9.1-27.3-7.3-.5-13.9 10.8-11.8 23-4.1-2-9.4-3.5-13-4.4-1-6.9-.3-14.6 2.9-21.8zM183 75.8c10.1 0 20.8 14.2 19.1 33.5-3.5 1-7.1 2.5-10.2 4.6 1.2-8.9-3.3-20.1-9.6-19.6-8.4.7-9.8 21.2-1.8 28.1 1 .8 1.9-.2-5.9 5.5-15.6-14.6-10.5-52.1 8.4-52.1zm-13.6 60.7c6.2-4.6 13.6-10 14.1-10.5 4.7-4.4 13.5-14.2 27.9-14.2 7.1 0 15.6 2.3 25.9 8.9 6.3 4.1 11.3 4.4 22.6 9.3 8.4 3.5 13.7 9.7 10.5 18.2-2.6 7.1-11 14.4-22.7 18.1-11.1 3.6-19.8 16-38.2 14.9-3.9-.2-7-1-9.6-2.1-8-3.5-12.2-10.4-20-15-8.6-4.8-13.2-10.4-14.7-15.3-1.4-4.9 0-9 4.2-12.3zm3.3 334c-2.7 35.1-43.9 34.4-75.3 18-29.9-15.8-68.6-6.5-76.5-21.9-2.4-4.7-2.4-12.7 2.6-26.4v-.2c2.4-7.6.6-16-.6-23.9-1.2-7.8-1.8-15 .9-20 3.5-6.7 8.5-9.1 14.8-11.3 10.3-3.7 11.8-3.4 19.6-9.9 5.5-5.7 9.5-12.9 14.3-18 5.1-5.5 10-8.1 17.7-6.9 8.1 1.2 15.1 6.8 21.9 16l19.6 35.6c9.5 19.9 43.1 48.4 41 68.9zm-1.4-25.9c-4.1-6.6-9.6-13.6-14.4-19.6 7.1 0 14.2-2.2 16.7-8.9 2.3-6.2 0-14.9-7.4-24.9-13.5-18.2-38.3-32.5-38.3-32.5-13.5-8.4-21.1-18.7-24.6-29.9s-3-23.3-.3-35.2c5.2-22.9 18.6-45.2 27.2-59.2 2.3-1.7.8 3.2-8.7 20.8-8.5 16.1-24.4 53.3-2.6 82.4.6-20.7 5.5-41.8 13.8-61.5 12-27.4 37.3-74.9 39.3-112.7 1.1.8 4.6 3.2 6.2 4.1 4.6 2.7 8.1 6.7 12.6 10.3 12.4 10 28.5 9.2 42.4 1.2 6.2-3.5 11.2-7.5 15.9-9 9.9-3.1 17.8-8.6 22.3-15 7.7 30.4 25.7 74.3 37.2 95.7 6.1 11.4 18.3 35.5 23.6 64.6 3.3-.1 7 .4 10.9 1.4 13.8-35.7-11.7-74.2-23.3-84.9-4.7-4.6-4.9-6.6-2.6-6.5 12.6 11.2 29.2 33.7 35.2 59 2.8 11.6 3.3 23.7.4 35.7 16.4 6.8 35.9 17.9 30.7 34.8-2.2-.1-3.2 0-4.2 0 3.2-10.1-3.9-17.6-22.8-26.1-19.6-8.6-36-8.6-38.3 12.5-12.1 4.2-18.3 14.7-21.4 27.3-2.8 11.2-3.6 24.7-4.4 39.9-.5 7.7-3.6 18-6.8 29-32.1 22.9-76.7 32.9-114.3 7.2zm257.4-11.5c-.9 16.8-41.2 19.9-63.2 46.5-13.2 15.7-29.4 24.4-43.6 25.5s-26.5-4.8-33.7-19.3c-4.7-11.1-2.4-23.1 1.1-36.3 3.7-14.2 9.2-28.8 9.9-40.6.8-15.2 1.7-28.5 4.2-38.7 2.6-10.3 6.6-17.2 13.7-21.1.3-.2.7-.3 1-.5.8 13.2 7.3 26.6 18.8 29.5 12.6 3.3 30.7-7.5 38.4-16.3 9-.3 15.7-.9 22.6 5.1 9.9 8.5 7.1 30.3 17.1 41.6 10.6 11.6 14 19.5 13.7 24.6zM173.3 148.7c2 1.9 4.7 4.5 8 7.1 6.6 5.2 15.8 10.6 27.3 10.6 11.6 0 22.5-5.9 31.8-10.8 4.9-2.6 10.9-7 14.8-10.4s5.9-6.3 3.1-6.6-2.6 2.6-6 5.1c-4.4 3.2-9.7 7.4-13.9 9.8-7.4 4.2-19.5 10.2-29.9 10.2s-18.7-4.8-24.9-9.7c-3.1-2.5-5.7-5-7.7-6.9-1.5-1.4-1.9-4.6-4.3-4.9-1.4-.1-1.8 3.7 1.7 6.5z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 4.7 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc.--><g fill="#00adef"><path d="M0 93.7l183.6-25.3v177.4H0V93.7zm0 324.6l183.6 25.3V268.4H0v149.9zm203.8 28L448 480V268.4H203.8v177.9zm0-380.6v180.1H448V32L203.8 65.7z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 404 B |
|
Before Width: | Height: | Size: 364 KiB After Width: | Height: | Size: 364 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 364 KiB After Width: | Height: | Size: 364 KiB |