最近在查找隐藏桌面窗口的方法,目前只查到用ShowWindow和SendMessage这两个方法。
ShowWindow:
nCmdShow:指定窗口如何显示。如果发送应用程序的程序提供了STARTUPINFO结构,则应用程序第一次调用ShowWindow时该参数被忽略。否则,在第一次调用ShowWindow函数时,该值应为在函数WinMain中nCmdShow参数。在随后的调用中,该参数可以为下列值之一:
SW_FORCEMINIMIZE:在WindowNT5.0中最小化窗口,即使拥有窗口的线程被挂起也会最小化。在从其他线程最小化窗口时才使用这个参数。nCmdShow=11。
SW_HIDE:隐藏窗口并激活其他窗口。nCmdShow=0。
SW_MAXIMIZE:最大化指定的窗口。nCmdShow=3。
SW_MINIMIZE:最小化指定的窗口并且激活在Z序中的下一个顶层窗口。nCmdShow=6。
SW_RESTORE:激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。nCmdShow=9。
SW_SHOW:在窗口原来的位置以原来的尺寸激活和显示窗口。nCmdShow=5。
SW_SHOWDEFAULT:依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的。nCmdShow=10。
SW_SHOWMAXIMIZED:激活窗口并将其最大化。nCmdShow=3。
SW_SHOWMINIMIZED:激活窗口并将其最小化。nCmdShow=2。
SW_SHOWMINNOACTIVE:窗口最小化,激活窗口仍然维持激活状态。nCmdShow=7。
SW_SHOWNA:以窗口原来的状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=8。
SW_SHOWNOACTIVATE:以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=4。
SW_SHOWNORMAL:激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志。nCmdShow=1。
c/c++中:
#include <windows.h>
HWND hwnd=FindWindow(“窗体类名”,"窗口名字");
ShowWindow(hwnd,SW_HIDE);
Sleep(5000);
ShowWindow(hwnd,SW_SHOW);
c#中:
using System.Runtime.InteropServices;
[DllImport("user32.dll", EntryPoint = "ShowWindow", SetLastError = true)]
static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow);
ShowWindow(hwnd,0);
Messagebox.show("隐藏");
ShowWindow(hwnd,5);
SendMessage:
详情见https://msdn.microsoft.com/en-us/library/ms632645(VS.85).aspx
c/c++:
#include "windows.h"
HWND hwnd=FindWindow(
“窗体类名”
,"
窗口名字
");
SendMessage(hWnd,
0x0018,0,0);
Sleep(5000);
SendMessage(hWnd,0x0018,0,0);
c#:
using System.Runtime.InteropServices;
[DllImport("user32.dll ", EntryPoint = "SendMessage ")]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
SendMessage(hWnd,0x0018,IntPtr(0),IntPtr(0));
Messagebox.show("隐藏");
SendMessage(hWnd,0x0018,IntPtr(0),IntPtr(0));
但是我发现有的应用不能隐藏,无意之下发现在windows xp下可以隐藏,最终发现原来是权限的问题。生成的程序以管理员运行就可以。也可以在代码中提升管理权限。。。