调用WIN32 API
using System.Runtime.InteropServices;
DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent,IntPtr hwndChildAfter,string lpszClass,string lpszWindow);
函数型:HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName);
函数功能:该函数获得一个顶层窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数不查找子窗口。在查找时不区分大小写。
参数:
IpClassName :指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobafAddAtom函数产生的全局成员。该成员为16位,必须位于IpClassName的低 16位,高位必须为 0。
IpWindowName:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为空,则为所有窗口全匹配。
返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄;如果函数失败,返回值为NULL。
函数原型:HWND FindWindowEx(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR lpszWindow);
函数功能:该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。
参数;
hwndParent:要查找子窗口的父窗口句柄。
如果hwnjParent为NULL,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。
Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函数仅查找所有消息窗口。
hwndChildAfter :子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndPareRt窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL,查找从hwndParent的第一个子窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。
lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位,必须位于lpClassName的低16位,高位必须为0。
lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL。
函数原型:BOOL SetWindowText(HWND hwnd,LPCTSTR lpStrjng);
函数功能:该函数改变指定窗口的标题栏的文本内容(如果窗口有标题栏)。如果指定窗口是一个控制,则改变控制的文本内容。然而,SetWindowText函数不改变其他应用程序中的控制的文本内容。
参数:
hWnd:要改变文本内容的窗口或控制的句柄。
lpString:指向一个空结束的字符串的指针,该字符串将作为窗口或控制的新文本。
返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。
备注:如果目标窗口属于当前进程,SetWindowText函数会使WM_SETTEXT消息发送给指定的窗口或控制。然而,如果控制是以WS_CAPTION风格创建的列表框控制,SetWindowText函数将为控制设置文本,而不是为列表项设置文本。
SetWindowText函数不扩展tab字符(ASCII代码0×09),Tab字符以字符‘}’来显示。
函数原型:BOOL ShowWindow(HWND hWnd,int nCmdShow);
函数功能:该函数设置指定窗口的显示状态。
参数:
hWnd:窗口句柄。
nCmdShow:指定窗口如何显示。如果发送应用程序的程序提供了STARTUPINFO结构,则应用程序第一次调用ShowWindow时该参数被忽略。否则,在第一次调用ShowWindow函数时,该值应为在函数WinMain中nCmdShow参数。在随后的调用中,该参数可以为下列值之一:
SW_FORCEMINIMIZE:在WindowNT5.0中最小化窗口,即使拥有窗口的线程被挂起也会最小化。在从其他线程最小化窗口时才使用这个参数。
SW_MIOE:隐藏窗口并激活其他窗口。
SW_MAXIMIZE:最大化指定的窗口。
SW_MINIMIZE:最小化指定的窗口并且激活在Z序中的下一个顶层窗口。
SW_RESTORE:激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。
SW_SHOW:在窗口原来的位置以原来的尺寸激活和显示窗口。
SW_SHOWDEFAULT:依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的。
SW_SHOWMAXIMIZED:激活窗口并将其最大化。
SW_SHOWMINIMIZED:激活窗口并将其最小化。
SW_SHOWMINNOACTIVATE:窗口最小化,激活窗口仍然维持激活状态。
SW_SHOWNA:以窗口原来的状态显示窗口。激活窗口仍然维持激活状态。
SW_SHOWNOACTIVATE:以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态。
SW_SHOWNOMAL:激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志。
返回值:如果窗口以前可见,则返回值为非零。如果窗口以前被隐藏,则返回值为零。
备注:应用程序第一次调用ShowWindow时,应该使用WinMain函数的nCmdshow参数作为它的nCmdShow参数。在随后调用ShowWindow函数时,必须使用列表中的一个给定值,而不是由WinMain函数的nCmdSHow参数指定的值。
正如在nCmdShow参数中声明的,如果调用应用程序的程序使用了在STARTUPINFO结构中指定的信息来显示窗口,则在第一次调用ShowWindow函数时nCmdShow参数就被忽略。在这种情况下,ShowWindow函数使用STARTUPINFO结构中的信息来显示窗口。在随后的调用中,应用程序必须调用ShowWindow 函数(将其中nCmdShow参数设为SW_SHOWDEFAULT)来使用由程序调用该应用程序时提供的启动信息。这个处理在下列情况下发生:
应用程序通过调用带WS_VISIBLE标志的函数来创建它们的主窗口函数;
应用程序通过调用清除了WS_VISIBLE标志的CteateWindow函数来创建主窗口函数,并且随后调用带SW_SHOW标志的ShowWindow函数来显示窗口;
=============================================================
例子:
using System.Runtime.InteropServices;
...
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent,IntPtr hwndChildAfter,string lpszClass,string lpszWindow);
[DllImport("user32.dll",CharSet=CharSet.Unicode)]
public static extern IntPtr PostMessage(IntPtr hwnd,int wMsg,IntPtr wParam,IntPtr lParam);
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
运用这些API来操作
...
hwnd_win = FindWindow(null, "用户登录");
if (hwnd_win == IntPtr.Zero)
{
MessageBox.Show("警告:找不到目标窗口");
return;
}
...
public void input(IntPtr mptr, string mstr)
{
Message msg;
UnicodeEncoding encode = new UnicodeEncoding();
char[] chars = encode.GetChars(encode.GetBytes(mstr));
foreach (char c in chars)
{
msg = Message.Create(mptr, WM_CHAR, new IntPtr(c), new IntPtr(0));
PostMessage(msg.HWnd, msg.Msg, msg.WParam, msg.LParam);
}
}