Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Ввод пароля звездочками в диалоге "Вопрос". (число прочтений - 3274 )
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Ввод пароля звездочками в диалоге "Вопрос".
23. Марта 2012 :: 09:48
Печать  
Вдруг кому пригодится.
Чтобы не рисовать отдельную обработку с полем ввода "для ввода пароля".
  

Inp.ert ( 7 KB | Загрузки )
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Ввод пароля звездочками в диалоге "Вопрос".
Ответ #1 - 26. Марта 2012 :: 03:35
Печать  
Переделал в виде функции класса (есть у меня спец.класс по имени "СистемныеФункции")
Код
Выбрать все
Процедура ВвестиПароль_ИзменитьСтильОкна() Экспорт
	ScrptCtrl = ВвестиПароль_ScrptCtrl;
	Таймер = клГлобал.Получить("ВвестиПароль_Таймер");

	hWnd = ScrptCtrl.Run("FindWindowEx", ВвестиПароль_Заголовок);
	If hWnd = 0  Then	Возврат;	EndIf;

	Таймер.Остановить();
	ScrptCtrl.Run("SendMessage", hWnd);
КонецПроцедуры

//======================================================================
Функция ВвестиПароль(Пароль, Заголовок, Длина, Таймаут = 0) Экспорт

	Если ПустоеЗначение(ВвестиПароль_ScrptCtrl) = 1 Тогда
		ТекстМодуля = "
			|Public Const ES_PASSWORD 			= &h20
			|Public Const EM_SETPASSWORDCHAR 	= &hCC
			|Public Const GW_CHILD				= &h5
			|Public Const GW_OWNER				= &h4
			|
			|Public Wrap
			|Public h1C
			|
			|Set Wrap = CreateObject(""DynamicWrapperX"")
			|Wrap.Register ""user32"",	""SendMessage""	 ,  ""i=hull""	, ""r=l""
			|Wrap.Register ""user32"", ""FindWindowEx"", ""i=hhss"", ""r=h""
			|Wrap.Register ""user32"", ""GetWindow"",   ""i=hu"", ""r=h""
			|Wrap.Register ""kernel32"", ""GetProcAddress"" , ""i=hl"", ""r=u""
			|Wrap.Register ""kernel32"", ""LoadLibrary"" , ""i=s"", ""r=h""
			|
			|'Хендл главного окна
			|handle = Wrap.LoadLibrary(""mfc42"")
			|func	= Wrap.GetProcAddress(handle, 6575)		'AfxGetMainWnd(void)
			|Wrap.RegisterAddr func, ""AfxGetMainWnd"", ""r=l""
			|h1C	= Wrap.NumGet(Wrap.AfxGetMainWnd(), &h20)
			|
			|Public Function FindWindowEx(Capt)
			|	FindWindowEx 	=  0
			|	hWnd 			= Wrap.FindWindowEx(0, 0, ""#32770"", Capt)
			|	ohWnd			= Wrap.GetWindow(hWnd, GW_OWNER)
			|	If ohWnd = h1C Then
			|		FindWindowEx 	= Wrap.GetWindow(hWnd, GW_CHILD)
			|	End If
			|End Function
			|
			|Public Function SendMessage(hWnd)
			|	res = Wrap.SendMessage (hWnd, EM_SETPASSWORDCHAR, 42, 0)
			|End Function
			|";

		ScrptCtrl			= СоздатьОбъект("MSScriptControl.ScriptControl");
		ScrptCtrl.Language	= "vbscript";
		Попытка
			ScrptCtrl.AddCode(ТекстМодуля);
		Исключение
			Message(ScrptCtrl.Error.Description);
			Message(ScrptCtrl.Error.Source);
			Message(ScrptCtrl.Error.Text);
			Возврат 0;
		КонецПопытки;
		ВвестиПароль_ScrptCtrl = ScrptCtrl;
	Иначе
		ScrptCtrl = ВвестиПароль_ScrptCtrl;
	КонецЕсли;

	ВвестиПароль_Заголовок = Заголовок;

	Таймер = СоздатьОбъект("Таймер");
	Таймер.ЗадатьОбработчикВОбъекте(Контекст, "ВвестиПароль_ИзменитьСтильОкна");

	клГлобал.Установить("ВвестиПароль_Таймер", Таймер);

	Таймер = клГлобал.Получить("ВвестиПароль_Таймер");
	Таймер.Запустить(100);
	Рез = ВвестиСтроку(Пароль, Заголовок, Длина,, Таймаут);

	клГлобал.Установить("ВвестиПароль_Таймер", "");

	Возврат Рез;
КонецФункции // ВвестиПароль 

Примечания:
Перем ВвестиПароль_ScrptCtrl, ВвестиПароль_Заголовок; //Локальные переменные класса
клГлобал - список значений, объявленный и созданный в глобальном модуле.
« Последняя редакция: 26. Марта 2012 :: 07:12 - Dmitry The Wing »  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать