Re: Как создать форму аутентификации подобную WinLogon
От: nicksnz  
Дата: 19.04.12 03:06
Оценка:
Решение:

через создание рабочего стола

1) описываем ссылки на WinApi функции

[StructLayout(Sequental, Unicode)]
public struct SECURITY_ATTRIBUTES{ public Int32 nLength, SecurityDescriptor, bInheritHandle; }

описываем ссылки на WinApi функции OpenDesktop, SwitchDesktop, SetThreadDesktop

[DllImport("user32.dll", Unicode)]
public static extern IntPtr CreateDesktop (string,string,Int32,UInt32,UInt32,IntPtr);

2) Когда нужно показать форму аутентификации,

2А) создаем новый поток, создаем рабочий стол для аутентификации (или открываем его) и создаем форму аутентификации


Thread thread = new Thread(new ThreadStart(()=>
{
logonDsk = createLoginDesk();
SetThreadDesktop(logonDsk);
SwitchDesktop(logonDsk);

loginForm = new LoginForm();
dlgResult = loginForm.ShowDialog();

var newdsk = OpenDesktop("Default",1,true,0x10000000);
SetThreadDesktop(newdsk);
SwitchDesktop(newdsk);
}));

2Б) функция createLoginDesk — создание рабочего стола для аутентификации (или открытие его)
string dskName = "Logon desktop";
SECURITY_ATTRIBUTES sAtt = new SECURITY_ATTRIBUTES(){nLength=Marshal.SizeOf(typeof(SECURITY_ATTRIBUTES)), bInheritHandle=1};
sAtt.lpSecurityDescriptor =0;

IntPtr hglobal = Marshal.AllocHGlobal(Marshal.SizeOf(sAtt));
Marshal.StructureToPtr(sAtt, hglobal, false);

IntPtr logonDsk = CreateDesktop (dskName, null, 0, 1, 0x10000000, hglobal);

Marshal.FreeHGlobal(hglobal);

3b) Когда форму показали, ждем завершения созданного потока и получаем данные из формы аутентификации, ссылку на которую заранее запомнили
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.