切换/创建桌面C#内部打开表单
您好,我已经在这个程序上工作了很长一段时间,我的目标是有一个锁定系统,可以在桌面之间切换,在第二个屏幕上有一个登录表单,允许您登录,但我遇到了一个问题,我无法从2太近的登录,所以第二个桌面可以被破坏,我必须手动关闭它我已经尝试过了调用close和hide时,我试图破坏进程,但我不会关闭,但它不会关闭。 如果我使用.ShowDialog方法打开表单,但如果我使用.show方法打开表单。它将关闭表单,但工作的任何部分都将显示为空白窗口 form1这是处理请求的主要表单切换/创建桌面C#内部打开表单,c#,multithreading,forms,class,C#,Multithreading,Forms,Class,您好,我已经在这个程序上工作了很长一段时间,我的目标是有一个锁定系统,可以在桌面之间切换,在第二个屏幕上有一个登录表单,允许您登录,但我遇到了一个问题,我无法从2太近的登录,所以第二个桌面可以被破坏,我必须手动关闭它我已经尝试过了调用close和hide时,我试图破坏进程,但我不会关闭,但它不会关闭。 如果我使用.ShowDialog方法打开表单,但如果我使用.show方法打开表单。它将关闭表单,但工作的任何部分都将显示为空白窗口 form1这是处理请求的主要表单 public
public Form1()
{
InitializeComponent();
// Create the thread object. This does not start the thread.
Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork);
workerThread.Start();
System.Threading.Thread.Sleep(3000);
workerObject.RequestStop();
}
}
public partial class Worker
{
static Desctop mDesktop = new Desctop();
// This method will be called when the thread is started.
public void DoWork()
{
mDesktop.CreateNewDesktop("Mayshotspot");
using (Form2 frm = new Form2())
{
frm.ShowDialog();
while (!_shouldStop) { }
frm.Close(); // this will not close the form
}
mDesktop.DestroyDesktop();
mDesktop.destroyProces();
}
public void RequestStop()
{
_shouldStop = true;
}
// Volatile is used as hint to the compiler that this data
// member will be accessed by multiple threads.
private volatile bool _shouldStop;
}
}
屏幕开关类
static string DesktopName = "Mayshotspot";
ArrayList list = new ArrayList();
public bool NeedBootStrapping()
{
return (GetDesktopName() == DesktopName);
}
public static string GetDesktopName()
{
int DLength = 0, DHandle = GetThreadDesktop(GetCurrentThreadId());
StringBuilder DName = new StringBuilder();
GetUserObjectInformation(DHandle, UOI_NAME, DName, 0, ref DLength);
if (DLength != 0) GetUserObjectInformation(DHandle, UOI_NAME, DName, DLength, ref DLength);
return (DName.ToString());
}
public void CreateNewDesktop(string DesktopName)
{
GetThreadDesktop(GetCurrentThreadId());
OpenInputDesktop(0, false, DESKTOP_SWITCHDESKTOP);
int DesktopHandle = CreateDesktop(DesktopName, "", 0, 0, GENERIC_ALL, 0);
SetThreadDesktop(DesktopHandle);
SwitchDesktop(DesktopHandle);
}
public void DestroyDesktop()
{
CreateNewDesktop("Default");
}
public Process StartProcess(string Path)
{
PROCESS_INFORMATION PI = new PROCESS_INFORMATION();
STARTUPINFO SI = new STARTUPINFO();
SI.cb = Marshal.SizeOf(SI);
SI.lpDesktop = DesktopName;
bool Result = CreateProcess(null, Path, IntPtr.Zero, IntPtr.Zero, true, NORMAL_PRIORITY_CLASS, IntPtr.Zero, null, ref SI, ref PI);
if (Result)
{
// WaitForSingleObject(PI.hProcess, INFINITE);
// CloseHandle(PI.hProcess);
//CloseHandle(PI.hThread);
list.Add(PI.dwProcessId);
return Process.GetProcessById(PI.dwProcessId);
}
else
{
DestroyDesktop();
return null;
}
}
public void SetProcessPriorityHigh()
{
SetThreadPriority(GetCurrentThread(), THREAD_BASE_PRIORITY_MAX);
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
}
public void ExitProces(int uExitCode)
{
// ExitProcess(uExitCode);
Process.GetProcessById(uExitCode).Kill();
}
public void destroyProces()
{
Process thisProc = Process.GetCurrentProcess();
foreach (int p in list)
{
try
{
Process.GetProcessById(p).Kill();
}
catch (Exception ex)
{
}
}
}
public void exitProces()
{
ExitProcess(0);
}
表单2-出现在桌面开关上的登录屏幕目前处于默认状态,直到我找到它不关闭的原因为止请查看可能的解决方案。您好,我已将其分解,我可以让它启动,但不能将其放在第二个桌面上,或者我将获得框架,但它不会自行关闭更多:-(例如)使用 S删除所有<代码>,删除<代码>命名空间< /代码>,删除空白行,是否真的“<代码> ExtNe>代码>声明?等等。您的读者必须水平滚动和垂直滚动,这通常会使这个问题变得很不吸引人。对不起,我希望这对你来说是一个更好的阅读。我已经删除了所有的基本功能,并删除了一些函数