Ik wil permanent een crosshair tekenen op het scherm.
Deze crosshair mag door niets worden overtekent en heeft als doel de crosshair in games te vervangen met als meerwaarde dat de kleur vd crosshair variabel is naargelang de kleur waarover de crosshair zit bevindt.
Mijn problemen:
1. De pixels worden in games overschreven door DirectX of OpenGL waardoor de crosshair flikkert.
2. Het complement vd RGB waarden levert niet het maximum contrast op.
Vooral dit 1e is irritant.
De werking zou eingelijk moeten zijn zoals bij bvb Fraps.
Elke mogelijke oplossing of tip is welkom, het gebruik van een direct3d device als het niet anders kan ik ook goed.
Als het opgelost raakt post ik wel even het project + de exe.
<update1>
Ondertussen even geprobeerd om rechtstreeks in het actieve window te tekenen door met GetForegroundWindow (uit user32.dll) een window handle op te vragen om daar vervolgens de graphics context van op te vragen met GetDC.
Dit doet echter niets, het lukt blijkbaar niet om in een window te gaan tekenen, enkel op de desktop.
</update1>
<update2>
*knip*
</update2>
</update3>
Even de sourcecode bijgewerkt.
Mensen die het willen testen moeten de source maar copy pasten en compileren.
</update3>
Deze crosshair mag door niets worden overtekent en heeft als doel de crosshair in games te vervangen met als meerwaarde dat de kleur vd crosshair variabel is naargelang de kleur waarover de crosshair zit bevindt.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
| /* * Author: Frederik De Ruyck * Copyrighted */ using System; using System.Runtime.InteropServices; namespace A_dots { static class Program { [DllImport("user32.dll", ExactSpelling = true, SetLastError = false)] private static extern IntPtr GetDC(IntPtr hWnd); [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = false)] private static extern UInt32 GetPixel(IntPtr hdc, int x, int y); [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = false)] private static extern UInt32 SetPixel(IntPtr hdc, int x, int y, UInt32 color); [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = false)] private static extern int GetDeviceCaps(IntPtr hdc, int index); private static IntPtr _display = GetDC(IntPtr.Zero); [STAThread] static void Main() { int width = GetDeviceCaps(_display, 8);//HORZRES int height = GetDeviceCaps(_display, 10);//VERTRES int x = width / 2; int y = height / 2; while (true) { //System.Threading.Thread.Sleep(1); //PatBlt(_display, x - 5, y - 1, 10, 2, 3); UInt32 pix = GetPixel(_display, x, y); //quad 1 midden + rechtsonder SetPixel(_display, x + 0, y + 1, CalcColorComplement(pix)); SetPixel(_display, x + 1, y + 1, CalcColorComplement(pix)); SetPixel(_display, x + 0, y + 2, CalcColorComplement(pix)); SetPixel(_display, x + 1, y + 2, CalcColorComplement(pix)); // //quad 2 midden + linksonder SetPixel(_display, x - 1, y + 1, CalcColorComplement(pix)); SetPixel(_display, x - 2, y + 1, CalcColorComplement(pix)); SetPixel(_display, x - 1, y + 2, CalcColorComplement(pix)); SetPixel(_display, x - 2, y + 2, CalcColorComplement(pix)); // //quad 3 midden + rechtsboven //SetPixel(_display, x + 0, y - 0, CalcColorComplement(pix));//<-SamplePixel SetPixel(_display, x + 1, y - 0, CalcColorComplement(pix)); SetPixel(_display, x + 0, y - 1, CalcColorComplement(pix)); SetPixel(_display, x + 1, y - 1, CalcColorComplement(pix)); // //quad 3 midden + linksboven SetPixel(_display, x - 1, y - 0, CalcColorComplement(pix)); SetPixel(_display, x - 2, y - 0, CalcColorComplement(pix)); SetPixel(_display, x - 1, y - 1, CalcColorComplement(pix)); SetPixel(_display, x - 2, y - 1, CalcColorComplement(pix)); } } private static UInt32 CalcColorComplement(int x, int y) { UInt32 pix = GetPixel(_display, x, y); return CalcColorComplement(pix); } private static UInt32 CalcColorComplement(UInt32 pix) { //rgb to hsl from http://www.geekymonkey.com/Programming/CSharp/RGB2HSL_HSL2RGB.htm //hsl to rgb from http://www.bobpowell.net/RGBHSB.htm //0x00bbggrr int P = (int)pix; int R = P & (255); int G = P & (65536 - 255); int B = P & (16777215 - 65536 - 255); G = G >> 8; B = B >> 16; float H = 0f, S = 0f, L = 0f; float r = R / 255f; float g = G / 255f; float b = B / 255f; float v; float m; float vm; float r2, g2, b2; H = 0; // default to black S = 0; L = 0; v = Math.Max(r, g); v = Math.Max(v, b); m = Math.Min(r, g); m = Math.Min(m, b); L = (m + v) / 2f; if (L > 0f) { vm = v - m; S = vm; if (S > 0f) { S /= (L <= 0.5f) ? (v + m) : (2f - v - m); r2 = (v - r) / vm; g2 = (v - g) / vm; b2 = (v - b) / vm; if (r == v) { H = (g == m ? 5f + b2 : 1f - g2); } else if (g == v) { H = (b == m ? 1f + r2 : 3f - b2); } else { H = (r == m ? 3f + g2 : 5f - r2); } H /= 6f; } } H = 1f - H; S = 1f - S; L = 1f - L; float temp1, temp2; if (L == 0) { r = g = b = 0; } else { if (S == 0) { r = g = b = L; } else { temp2 = ((L <= 0.5f) ? L * (1f + S) : L + S - (L * S)); temp1 = 2f * L - temp2; float[] t3 = new float[] { H + 1f / 3f, H, H - 1f / 3f }; float[] clr = new float[] { 0, 0, 0 }; for (int i = 0; i < 3; i++) { if (t3[i] < 0) t3[i] += 1f; if (t3[i] > 1) t3[i] -= 1f; if (6.0 * t3[i] < 1.0) clr[i] = temp1 + (temp2 - temp1) * t3[i] * 6f; else if (2.0 * t3[i] < 1.0) clr[i] = temp2; else if (3.0 * t3[i] < 2.0) clr[i] = (temp1 + (temp2 - temp1) * ((2f / 3f) - t3[i]) * 6f); else clr[i] = temp1; } r = clr[0]; g = clr[1]; b = clr[2]; } } R = (int)(255 * r); G = (int)(255 * g); B = (int)(255 * b); G = G << 8; B = B << 16; UInt32 result = (UInt32)(R + G + B); return result; } } } |
Mijn problemen:
1. De pixels worden in games overschreven door DirectX of OpenGL waardoor de crosshair flikkert.
2. Het complement vd RGB waarden levert niet het maximum contrast op.
Vooral dit 1e is irritant.
De werking zou eingelijk moeten zijn zoals bij bvb Fraps.
Elke mogelijke oplossing of tip is welkom, het gebruik van een direct3d device als het niet anders kan ik ook goed.
Als het opgelost raakt post ik wel even het project + de exe.
<update1>
Ondertussen even geprobeerd om rechtstreeks in het actieve window te tekenen door met GetForegroundWindow (uit user32.dll) een window handle op te vragen om daar vervolgens de graphics context van op te vragen met GetDC.
Dit doet echter niets, het lukt blijkbaar niet om in een window te gaan tekenen, enkel op de desktop.
</update1>
<update2>
*knip*
</update2>
</update3>
Even de sourcecode bijgewerkt.
Mensen die het willen testen moeten de source maar copy pasten en compileren.
</update3>
[ Voor 67% gewijzigd door peke op 31-01-2007 18:13 ]