Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2016, 17:14   #1
ptz2010
 
Регистрация: 31.03.2009
Сообщений: 8
Вопрос Как в C# с использованием WinAPI изменить стиль окна (убрать рамку, например)?

Добрый день!
Есть следующий код... В окне моей программы открывается окно сторонней программы.
Как указать расположение и размеры окна понятно, а как изменить стиль окна (убрать рамку, например)?

Код:
public partial class FormNotepad : Form
    {
        public FormNotepad()
        {
            InitializeComponent();
            System.Diagnostics.Process pictureBoxApp = new System.Diagnostics.Process();
            pictureBoxApp.StartInfo.UseShellExecute = true;
            pictureBoxApp.StartInfo.Arguments += "";
            pictureBoxApp.StartInfo.FileName = "Notepad.exe";
            pictureBoxApp.Start();
            this.timer1.Enabled = true;
        }
 
        void Timer1Tick(object sender, EventArgs e)
        {
            System.IntPtr winParent;
            System.IntPtr x;
            System.IntPtr winHandle = Usr32.FindWin(null, "Безымянный - Блокнот");
            if (winHandle != System.IntPtr.Zero)
            {
                winParent = Usr32.GetParent(winHandle);
                x = Usr32.SetParent(winHandle, this.pictureBox1.Handle);
                x = Usr32.SetWindowPos(winHandle, 1, 0, 0, 500, 300, 0); //Здесь я указываю параметры для окна сторонней программы
                this.timer1.Enabled = false;
            }
            
        }
 
        private void buttonMenu_Click(object sender, EventArgs e)
        {
            this.Close();
        }
                
        
    }
    public class Usr32
    {
        #region Class Variables
        public const int SM_CXSCREEN = 0;
        public const int SM_CYSCREEN = 1;
        #endregion
 
        #region Class Functions
        [DllImport("user32.dll", EntryPoint = "FindWindow")]
        public static extern IntPtr FindWin(string lpClassName, string lpWindowName);
 
        [DllImport("user32.dll", EntryPoint = "SetParent")]
        public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
 
        [DllImport("user32.dll", EntryPoint = "GetParent")]
        public static extern IntPtr GetParent(IntPtr hWnd);
 
        [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
        public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);
 
        [DllImport("user32.dll", EntryPoint = "ShowWindow")]
        public static extern IntPtr ShowWindow(IntPtr hWnd, long nCmdShow);
 
        [DllImport("user32.dll", EntryPoint = "CloseWindow")]
        public static extern IntPtr CloseWindow(IntPtr hWnd);
 
        [DllImport("user32.dll", EntryPoint = "DestroyWindow")]
        public static extern IntPtr DestroyWindow(IntPtr hWnd);
 
        #endregion
    }
ptz2010 вне форума Ответить с цитированием
Старый 24.03.2016, 17:19   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

SetWindowLong?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 24.03.2016, 17:28   #3
ptz2010
 
Регистрация: 31.03.2009
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
SetWindowLong?
Да, я копал в эту сторону.
Только MSDN рекомендует использовать SetWindowLongPtr для совместимости с 64bit.

Только как правильно применить? Я в WinAPI почти ноль...
ptz2010 вне форума Ответить с цитированием
Старый 24.03.2016, 17:54   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Почитать документацию по нему и передать нужные параметры.
Вот пример объявления в .NET http://www.pinvoke.net/default.aspx/...owLongPtr.html

Не уверен точно зачем тут проверка 64 бит ли хотя в MSDN вроде написано что на 32 и так вызовется функция без Ptr. Может быть в MSDN речь только о С/С++ со стандартным хедером Windows.h и в нем просто объявлен макрос подставляющий нужную функцию, а самой функции в библиотеке нет на 32 ОС.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 25.03.2016, 12:53   #5
ptz2010
 
Регистрация: 31.03.2009
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Почитать документацию по нему и передать нужные параметры.
Вот пример объявления в .NET http://www.pinvoke.net/default.aspx/...owLongPtr.html
Воспользовался примером, но при выполнении
Код:
return new IntPtr(SetWindowLong32(hWnd, nIndex, dwNewLong));
вылетает
Цитата:
Вызов функции PInvoke "EnergyInfoKiosk!EnergyInfoKiosk.Us r32::SetWindowLong32" разбалансировал стек...
ptz2010 вне форума Ответить с цитированием
Старый 25.03.2016, 13:05   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

В примере ж не так.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 25.03.2016, 15:15   #7
ptz2010
 
Регистрация: 31.03.2009
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
В примере ж не так.
Да, неправильно набрал.

Вылезла другая проблема:
Код:
SetWindowLongPtr(winHandle, -16, 0x01000000);
ругается на недопустимые аргументы.
Хотя вроде всё правильно. Или я уже просто настолько запарился, что не вижу очевидной ошибки?
ptz2010 вне форума Ответить с цитированием
Старый 25.03.2016, 15:35   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Код:
new IntPtr(0x01000000)
И в SetWindowLong надо либо везде заменить HandleRef на IntPtr, либо создать HandleRef из winHandle.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 25.03.2016, 16:12   #9
ptz2010
 
Регистрация: 31.03.2009
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
И в SetWindowLong надо либо везде заменить HandleRef на IntPtr, либо создать HandleRef из winHandle.
С этим уже разобрался и заменил на IntPtr.

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Код:
new IntPtr(0x01000000)
Получается, затык был только в этом. Теперь работает.

Alex11223, огромное СПАСИБО!
ptz2010 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как убрать рамку стрраницы elena1704 Microsoft Office Word 9 11.09.2013 14:15
Изменить системное меню и стиль окна Stilet Win Api 2 21.05.2013 22:40
Создание окна(asm) с использованием WinApi Alex1991 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 04.04.2011 13:20
Как изменить стиль гиперссылки? Нужно убрать рамку вокруг картинки. GLB HTML и CSS 5 18.01.2009 19:18
Как зделоть например, квадрат прозрачным а рамку зелёной? Лис_ Общие вопросы по Java, Java SE, Kotlin 1 30.12.2008 10:09