应用程序A(例如:AutoCAD,Word,...)运行时,它会在运行时调用DLL X来执行任务→打开表单登录
应用程序B(例如:Photoshop,Excel ...)运行时,它会在运行时调用DLL Y执行任务→我想关闭上面的登录表单可以做到这一点吗?
这可能吗?
答案 0 :(得分:0)
如果它只是关闭运行进程最简单的方法可能就像
disableKeyguard()
打开你可能会循环所需名称的过程。它的效率不是很高,但如果它只是在你之后开启和关闭,它就能完成任务。
答案 1 :(得分:0)
您可以使用(仅示例)无窗口控制台应用程序继续检查新进程。我有一个例子:
使用控制台应用程序和登录表单
使控制台应用程序成为这样的Windows应用程序:
在控制台应用程序中创建一个检查进程的计时器:
public static bool IsOpen = false;
static void Main(string[] args)
{
Timer t = new Timer(TimerCallback, null, 0, 1200);
while ( true )
{
//keep it running
}
}
private static void TimerCallback(Object o)
{
if ( !IsOpen && Process.GetProcesses().Select( r => r.ProcessName ).Contains( "EXCEL" ) )
{
//Excel is running, show the form
Form1 loginForm = new Form1();
loginForm.ShowDialog();
//Stop it from spawning a million forms by setting bool
IsOpen = true;
}
}
当应用程序关闭时关闭Form的逻辑也可以放在这个计时器中,以同样的方式使用它。
要从控制台窗口打开表单,您需要添加对控制台应用程序的引用:
如果您需要流程名称:
只需使用表单并添加:
foreach ( var proc in Process.GetProcesses() )
{
MessageBox.Show( proc.ProcessName );
}
这将显示当前正在运行的所有进程的名称。
答案 2 :(得分:0)
这是一个小样本,展示了如何在另一个进程中关闭Window。创建一个新的Windows窗体项目,在其中添加两个窗体并在第一个上添加两个按钮并将该代码放在Form1中:
public partial class Form1 : Form
{
delegate bool EnumWindowsProc(IntPtr Hwnd, IntPtr lParam);
[DllImport("user32", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private extern static bool EnumThreadWindows(int threadId, EnumWindowsProc callback, IntPtr lParam);
[DllImport("user32", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);
[DllImport("user32", SetLastError = true, CharSet = CharSet.Auto)]
private extern static int GetWindowText(IntPtr hWnd, StringBuilder text, int maxCount);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
private const int WM_CLOSE = 0x10;
public Form1()
{
InitializeComponent();
button1.Click += button1_Click;
button2.Click += button2_Click;
}
private void button1_Click(object sender, EventArgs e)
{
var frm = new Form2();
frm.Show(this);
}
private void button2_Click(object sender, EventArgs e)
{
Process[] processes = Process.GetProcessesByName("FindWindowSample");
foreach (Process p in processes)
{
var handle = FindWindowInProcess(p, x => x == "Form2");
if (handle != IntPtr.Zero)
{
SendMessage(handle, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
}
}
}
public static IntPtr FindWindowInProcess(Process process, Func<string, bool> compareTitle)
{
IntPtr windowHandle = IntPtr.Zero;
foreach (ProcessThread t in process.Threads)
{
windowHandle = FindWindowInThread(t.Id, compareTitle);
if (windowHandle != IntPtr.Zero)
{
break;
}
}
return windowHandle;
}
private static IntPtr FindWindowInThread(int threadId, Func<string, bool> compareTitle)
{
IntPtr windowHandle = IntPtr.Zero;
EnumThreadWindows(threadId, (hWnd, lParam) =>
{
StringBuilder text = new StringBuilder(200);
GetWindowText(hWnd, text, 200);
if (compareTitle(text.ToString()))
{
windowHandle = hWnd;
return false;
}
return true;
}, IntPtr.Zero);
return windowHandle;
}
}
编译然后运行该应用程序的两个实例。在第一个单击Button1以显示Form2。在第二个实例上,单击Button2以从第一个实例关闭Form2。