Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Проблема при работе с окнами через windows API


Автор: V0fka 2.7.2013, 10:17
Привет!

Использую C#, ось Windows 7.

Хочу активировать окно приложения. Для этого добавил вызов ряда функций, среди которых есть такая:

Код

[DllImport("coredll.dll", EntryPoint = "CreateMutex", SetLastError = true)]
public static extern IntPtr CreateMutex(IntPtr lpMutexAttributes, bool InitialOwner, string MutexName);


Но при попытке вызова получаю ошибку, в которой говорится:
Цитата
System.DllNotFoundException: Не удается загрузить DLL "coredll.dll": Не найден указанный модуль. (Исключение из HRESULT: 0x8007007E)


Пробовал вместо coredll.dll указать core.dll (пальцем в небо), но результат тот же. Пробовал искать в системе указанную библиотеку - не находит.

Подскажите, пожалуйста, как решить проблему.

Автор: diadiavova 2.7.2013, 10:29
Правильно имя библиотеки указать видимо надо. Например kernel32.dll

Автор: dzaraev 2.7.2013, 10:43
Цитата(V0fka @  2.7.2013,  10:17 Найти цитируемый пост)
Пробовал искать в системе указанную библиотеку - не находит.

Если вы не можете найти, почему CLR должен смочь? )) Система у вас с CLR одна на двоих. Нужно разобраться с примером, из которого вы взяли код - что это за библиотека и откуда она. Может быть ваш пример был предназначен под Windows CE например и т.д.
Скорее всего diadiavova прав, но лучше вам разобраться, а не тыкать пальцем в небо.

Автор: V0fka 2.7.2013, 15:12
Цитата(diadiavova @  2.7.2013,  10:29 Найти цитируемый пост)
Правильно имя библиотеки указать видимо надо. Например kernel32.dll

Да, спасибо! smile

Цитата(dzaraev @  2.7.2013,  10:43 Найти цитируемый пост)
Если вы не можете найти, почему CLR должен смочь? )) Система у вас с CLR одна на двоих. Нужно разобраться с примером, из которого вы взяли код - что это за библиотека и откуда она. Может быть ваш пример был предназначен под Windows CE например и т.д.Скорее всего diadiavova прав, но лучше вам разобраться, а не тыкать пальцем в небо.

Я догадался, что нет нужной мне библиотеки (той, которая была в примере кода). И я поэтому специально написал, что использую Windows 7, т.к. подумал, что может быть пример кода отличается поведением в разных ОС. В общем, ДядяВова прав, надо было другую длл указать. Спасибо за ответ! smile

У меня теперь появилась другая проблема smile . Окно нахожу, открываю

Код
SetWindowPos(h, 0, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, 0x0040);


но оно открывается только, если не свернуто. Т.е. если окно находится за другим - отрабатывает как положено. А если нажать на кнопку "свернуть", то оно просто активируется (подсвечивается) в панеле задач. Как мне его развернуть?

Автор: diadiavova 3.7.2013, 21:17
Цитата(V0fka @  2.7.2013,  16:12 Найти цитируемый пост)
Как мне его развернуть? 

Видимо как-то так
http://pinvoke.net/default.aspx/user32.ShowWindow
Хотя, если речь об окне твоего же приложения, то винапи тут вообще ни при чем, можно с формами работать непосредственно, а для окон других приложений можно использовать UIAutomation. В уиаутомэйшн разбираться, конечно, придется, но насколько я понимаю, в винапи ты тоже отнюдь не как рыба в воде, так что ничего не потеряешь.

Автор: V0fka 4.7.2013, 17:29
diadiavova, ну, что я могу сказать... Ты как всегда smile ! Спасибо!

"Окно приложения" - это не форма моего приложения, а окно какого-то запущенного "левого" приложения. С помощью UIAutomation получилось достичь эффекта, который я достиг до создания этой темы (могу активировать окно, если оно не свернуто). Если можно как-то развернуть окно - сообщите, пожалуйста (академический интерес smile ). А через WinAPI получилось развернуть smile .

Автор: diadiavova 6.7.2013, 00:23
Цитата(V0fka @  4.7.2013,  18:29 Найти цитируемый пост)
Если можно как-то развернуть окно - сообщите, пожалуйста (академический интерес smile ).

Ну что-то типа такого. Этот код разворачивает окно блокнота(первое, которое найдет), в данном случае во весь экран, но можно установить Normal
Код

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Automation;
using System.Linq;

namespace automationmaximazewindow
{
    class Program
    {
        static void Main(string[] args)
        {
            var notepad = (from AutomationElement win in FindWindows() where win.Current.Name.Contains("Блокнот") select win).FirstOrDefault();
            (notepad.GetCurrentPattern(WindowPattern.Pattern) as WindowPattern).SetWindowVisualState(WindowVisualState.Maximized);
            Console.ReadKey();
        }


        static AutomationElementCollection FindWindows()
        {
            return AutomationElement.RootElement.FindAll(TreeScope.Children,new PropertyCondition(AutomationElement.ControlTypeProperty,System.Windows.Automation.ControlType.Window));
        }
    }
}


Автор: V0fka 8.7.2013, 10:03
diadiavova, спасибо! smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)