2017年1月22日 星期日

[C/C++] 隱藏視窗(ShowWindow)

要隱藏視窗的方法其實有好幾種,但這裡只介紹一種。

#include<windows.h>

ShowWindow(HWND,State);

基本上就是把一個window的hwnd抓下來後,
使用ShowWindow(hwnd,想要的模式);即可。

*hwnd:可以想像成一個視窗的代碼。

想要的模式可以有以下:
SW_FORCEMINIMIZE
11
Minimizes a window, even if the thread that owns the window is not responding. This flag should only be used when minimizing windows from a different thread.

SW_HIDE
0
Hides the window and activates another window.

SW_MAXIMIZE
3
Maximizes the specified window.

SW_MINIMIZE
6
Minimizes the specified window and activates the next top-level window in the Z order.

SW_RESTORE
9
Activates and displays the window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when restoring a minimized window.

SW_SHOW
5
Activates the window and displays it in its current size and position.

SW_SHOWDEFAULT
10
Sets the show state based on the SW_ value specified in the STARTUPINFO structure passed to the CreateProcess function by the program that started the application.

SW_SHOWMAXIMIZED
3
Activates the window and displays it as a maximized window.

SW_SHOWMINIMIZED
2
Activates the window and displays it as a minimized window.

SW_SHOWMINNOACTIVE
7
Displays the window as a minimized window. This value is similar to SW_SHOWMINIMIZED, except the window is not activated.

SW_SHOWNA
8
Displays the window in its current size and position. This value is similar to SW_SHOW, except that the window is not activated.

SW_SHOWNOACTIVATE
4
Displays a window in its most recent size and position. This value is similar to SW_SHOWNORMAL, except that the window is not activated.

SW_SHOWNORMAL
1
Activates and displays a window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when displaying the window for the first time.
如果是要讓自己編譯出來的執行檔可以做隱藏的話,
那麼現在只剩下一個問題:
<該如何找到我這個視窗的hwnd?>
當前視窗的抓法:

GetForegroundWindow();

因為一開始執行的時候,當前視窗就是我執行的檔案,所以可以直接這樣寫。
ShowWindow(GetForegroundWindow(),SW_HIDE);

但是如果是要一直可以追蹤(例如做背景程序之類的)
可以一開始就記錄好或者是事後再追查,就像這樣:
char title[100];
GetConsoleTitle(title,100);
HWND clip=FindWindow("ConsoleWindowClass",title);
ShowWindow(clip,SW_SHOW);

其中,GetConsoleTitle的相反就是SetConsoleTitle -> 可以設定標頭名稱。

整理一下函式(皆需要#include<windows.h>):


GetConsoleTitle(char *title,100);

SetConsoleTitle(char *title);

FindWindow(class_name,window_name);
GetConsoleTitle(title,100); -> title會變成這個console的標題
如此一來就可以達成改變視窗模式。

沒有留言:

張貼留言