用vs可以调通的这个隐藏,显示窗体代码(参考:http://blog.csdn.net/studentsky/article/details/8141146)
// 获取窗口标题
[DllImport("user32", SetLastError = true)]
public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount
);
//获取类的名字
[DllImport("user32.dll")]
private static extern int GetClassName(
IntPtr hWnd,
StringBuilder lpString,
int nMaxCount
);
//根据坐标获取窗口句柄
[DllImport("user32")]
private static extern IntPtr WindowFromPoint(
Point Point
);
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
public static class NativeMethods
{
internal const uint GW_OWNER = 4;
internal delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern int GetWindowThreadProcessId(IntPtr hWnd, out IntPtr lpdwProcessId);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool IsWindowVisible(IntPtr hWnd);
}
// 隐藏窗口
public const int SW_HIDE = 0;
public const int SW_SHOWNORMAL = 1;
public const int SW_NORMAL = 1;
public const int SW_SHOWMINIMIZED = 2;
public const int SW_SHOWMAXIMIZED = 3;
public const int SW_MAXIMIZE = 3;
public const int SW_SHOWNOACTIVATE = 4;
public const int SW_SHOW = 5;
public const int SW_MINIMIZE = 6;
public const int SW_SHOWMINNOACTIVE = 7;
public const int SW_SHOWNA = 8;
public const int SW_RESTORE = 9;
public const int SW_SHOWDEFAULT = 10;
public const int SW_FORCEMINIMIZE = 11;
public const int SW_MAX = 11;
protected void button2_Click(object sender, EventArgs e)
{
IntPtr formHandle = GetMainWindowHandle(GetProcessPID());
ShowWindow(formHandle, SW_HIDE);
}
protected void button3_Click(object sender, EventArgs e)
{
IntPtr formHandle = GetMainWindowHandle(GetProcessPID());
ShowWindow(formHandle, SW_SHOW);
}
///
/// 通过进程PID取得窗体句柄
///
///
///
public static IntPtr GetMainWindowHandle(int processId)
{
IntPtr MainWindowHandle = IntPtr.Zero;
NativeMethods.EnumWindows(new NativeMethods.EnumWindowsProc((hWnd, lParam) =>
{
IntPtr PID;
NativeMethods.GetWindowThreadProcessId(hWnd, out PID);
if (PID == lParam &&
NativeMethods.GetWindow(hWnd, NativeMethods.GW_OWNER) == IntPtr.Zero)//NativeMethods.IsWindowVisible(hWnd) && 把原文中这句去掉,因为要 隐藏后还能显示
{
MainWindowHandle = hWnd;
return false;
}
return true;
}), new IntPtr(processId));
return MainWindowHandle;
}
///
/// 通过进程名取得进程PID
///
///
private int GetProcessPID()
{
try
{
//进程名称不要加上.exe
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("WindowsFormsApplication1");
if (processes != null && processes.Length != 0)
{
return processes[0].Id;
}
throw new Exception();
}
catch (Exception ex)
{
throw ex;
}
}
放到iis中 调用不成功,为什么调用服务端的windows api也不行?
[DllImport("advapi32.dll")] //引入Windows的API
public static extern bool LogonUser(
string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
out int phToken
);
1、调用windows 登录验证(放到iis中也正常):
int num1; if (!LogonUser("huhaibin", "YYDDD-20111030O", "123456", 2, 0, out num1)) { this.listBox1.Items.Add("huhaibin登录失败"); } else { this.listBox1.Items.Add("huhaibin登录成功!"); }
2、还有一个调用电脑发声的 放到iis中也正常,
[DllImport("kernel32.dll")]
private static extern int Beep(int dwFrep, int dwDuration);
调用:
protected void Button2_Click(object sender, EventArgs e)
{
Beep(1000, 500);//扬声器发声
}
就是 用到user32.dll 放在iis中不起作用,难道和dll有关?请懂的 指点一二
为了解决上面调用的不起的现象,参考:(whuthj) http://whuthj.iteye.com/blog/665699 创建activeX控件,把上面的 隐藏、显示代码替换进去,安装控件后,在iis中运行测试页,正常(可以访问客户端的windows api,在服务端浏览网页当然也能调用服务端的,但是仍然没有解决 客户端调用服务端api的这个问题)
也许和权限有关,有空看看:http://www.cnblogs.com/fish-li/archive/2012/05/07/2486840.html