Я пишу программу на c #, которая реализует хуки для мыши и клавиатуры, и после нажатия на указанную клавишу она перейдет к окну переднего плана и сохранит его x, y, высоту и ширину в xml-файле.
IЯ не уверен, что не так, но я продолжаю получать неправильные размеры и неправильные параметры.
Я был бы признателен за помощь по этому вопросу, поскольку я боролся с ним в течение двух дней.
Сильфонсоответствующий код.
Стандартные объявления:
//rectangle for the windows size
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
//win API
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetForegroundWindow();
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern bool SetForegroundWindow(IntPtr hwnd);
[DllImport("user32.dll", SetLastError = true)]
static extern bool GetWindowRect(IntPtr hWnd, ref RECT Rect);
И сам соответствующий код
void mouseHook_MouseDown(object sender, MouseEventArgs e)
{
this.handle = GetForegroundWindow();
}
#region keyboard pressed
void keyboardHook_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.F9) //if slot selected
{
RECT Rect = new RECT();
SetForegroundWindow(this.handle);
//this.handle = GetForegroundWindow();
GetWindowRect(this.handle, ref Rect);
Grid newSlot = new Grid();
newSlot.topX = Rect.Top;
newSlot.topY = Rect.Left;
newSlot.width = Rect.Right - Rect.Left;
newSlot.height = Rect.Bottom - Rect.Top;
layoutGrid.Add(newSlot);
lbl_slots.Text = layoutGrid.Count().ToString();
}
else if (e.KeyCode == Keys.F10) //if main stack slot selected
{
RECT Rect = new RECT();
SetForegroundWindow(handle);
GetWindowRect(GetForegroundWindow(), ref Rect);
for (int i = 0; i < layoutGrid.Count(); i++) //selecting slot for main stack
{
layoutGrid[i].slot_number = i + 1; //setting slots numbers
if (layoutGrid[i].topX != Rect.Top && layoutGrid[i].topY != Rect.Left)
layoutGrid[i].is_stack = false;
else
{
layoutGrid[i].is_stack = true;
lbl_stackSlot.Text = (i + 1).ToString();
}
}
}
}
РЕДАКТИРОВАТЬ: Я пытался использовать оба открытыхstruct RECT и Rectangle, значения с RECT, которые я получаю, кажутся случайными, я имею в виду left и top, а также height и width, иногда он находит правильные точки, но иногда кажется, что они абсолютно случайные.Кажется, что значения, которые я получаю с помощью Rectangle, имеют правильные левый и верхний угол, но возвращают неправильную высоту и ширину.