SetWindowPos для определенного окна

У меня есть

        [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
    public static extern IntPtr SetWindowPos(string hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);

Моя проблема в том, что я хочу иметь возможность перемещать конкретное окно на основе текста внутри моей метки.

        private void button1_Click(object sender, EventArgs e)
    {
        const short SWP_NOSIZE = 1;
        const short SWP_NOZORDER = 0X4;
        const int SWP_SHOWWINDOW = 0x0040;

        Process[] processes = Process.GetProcesses();


        foreach (var process in processes)
        {
            IntPtr handle = process.MainWindowHandle;
            string Text = handle.ToString();

            if (handle.ToString() == WindowTextBox.Text)
            {
                SetWindowPos(Text, 0, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);
            }
        }
    }

Я знал, что это не сработает, но все равно хотел попробовать, как еще я смогу переместить окно на основе того, что находится внутри моего WindowTextBox? (имея дескриптор IntPtr в SetWindowPos(IntPtr hWnd, [...]) и просто изменяя

SetWindowPos(Text, 0, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);

to

SetWindowPos(handle, 0, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);

тоже не работает.) Любые предложения?


person Community    schedule 09.09.2012    source источник
comment
Вы уверены, что SetWindowPos выполняется?   -  person harpo    schedule 09.09.2012
comment
Да, когда я проверяю, пуст ли дескриптор, и просто перемещаю все активные окна, все работает нормально.   -  person    schedule 09.09.2012
comment
Итак, handle.ToString() — это не то, что вы думаете. Вы должны отслеживать его и WindowTextBox.Text.   -  person harpo    schedule 09.09.2012
comment
Начните с исправления объявления pinvoke. Это неправильно, и 1-й, и 2-й аргументы - IntPtr. Посетите сайт pinvoke.net, чтобы найти нужный: pinvoke.net/default.aspx/user32 /SetWindowPos.html   -  person Hans Passant    schedule 09.09.2012


Ответы (1)


Догадаться. я использовал

[DllImport("user32.dll")]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

изменить строку на

IntPtr handle = FindWindow(null, WindowTextBox.Text);

и если

if (handle != IntPtr.Zero)

и это работает именно так, как я хочу, спасибо!

person Community    schedule 10.09.2012