Browse Source

添加隐藏指定进程窗口的功能。

Jeff Wang 3 years ago
parent
commit
7ff87a2cda

+ 51 - 0
Source/InjectDLL/InjectDLL/Global.cpp

@@ -945,6 +945,57 @@ BOOL MySystemShutdown()
 	return TRUE;
 }
 
+HWND GetProcessMainWnd(const DWORD& dwTagetProcessId, LPCTSTR lpTagetWndName)
+{
+    DWORD dwCurPorcessId = 0;
+    HWND hTagetProcessWnd = NULL;
+    TCHAR szWndName[MAX_PATH] = { 0 };
+    TCHAR szClassName[MAX_PATH] = { 0 };
+
+    // 取得第一个窗口句柄;
+    for (HWND hCurWnd = ::GetTopWindow(NULL); hCurWnd != NULL; hCurWnd = ::GetNextWindow(hCurWnd, GW_HWNDNEXT)) {
+        // 重置为0;
+        dwCurPorcessId = 0;
+        // 通过窗口句柄反查进程pid;
+        DWORD dwThreadId = ::GetWindowThreadProcessId(hCurWnd, &dwCurPorcessId);
+        if (dwThreadId != 0) {
+            // 判断当前进程id是否和目标进程id相同;
+            if (dwCurPorcessId == dwTagetProcessId) {
+                if (lpTagetWndName == NULL) {
+                    hTagetProcessWnd = hCurWnd;
+                    break;
+                }
+                else {
+                    // 获取窗口名称;
+                    ::GetWindowText(hCurWnd, szWndName, sizeof(szWndName) / sizeof(TCHAR));
+                    // 获取窗口类名;
+                    ::GetClassName(hCurWnd, szClassName, sizeof(szClassName) / sizeof(TCHAR));
+#ifdef _DEBUG
+                    TCHAR szLogMsg[MAX_PATH] = { 0 };
+                    _stprintf_s(szLogMsg, _T("类名:%s, 窗口名:%s,窗口地址:%p \n"), szClassName, szWndName, hCurWnd);
+                    OutputDebugString(szLogMsg);
+#endif
+                    if (_tcsstr(szWndName, lpTagetWndName) != NULL) {
+                        hTagetProcessWnd = hCurWnd;
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    // 当前窗口有可能不是进程父窗口;
+    HWND hParentWnd = hTagetProcessWnd;
+    while (hParentWnd) {
+        hParentWnd = ::GetParent(hTagetProcessWnd);
+        if (hParentWnd == NULL)
+            break;
+        hTagetProcessWnd = hParentWnd;
+    }
+
+    return hTagetProcessWnd;
+}
+
 BOOL GetWeChatPath()
 {
 	// 通过注册表获取微信安装目录;

+ 4 - 0
Source/InjectDLL/InjectDLL/Global.h

@@ -65,6 +65,10 @@ extern BOOL MySystemShutdown(LPTSTR lpMsg);
 extern BOOL PreventSystemShutdown();
 extern BOOL MySystemShutdown();
 
+// 根据进程pid获取进程对应程序的窗口句柄;
+HWND GetProcessMainWnd(const DWORD& dwTagetProcessId, LPCTSTR lpTagetWndName);
+// 获取指定进程名的进程主窗口;
+HWND GetProcessMainWnd(LPCTSTR lpProcessName, LPCTSTR lpTagetWndName);
 
 //////////////////////////////////////////////////////////////////////////
 extern BOOL GetWeChatPath();

+ 4 - 2
Source/InjectDLL/InjectDLL/InjectDLL.rc

@@ -98,9 +98,11 @@ BEGIN
     PUSHBUTTON      "取消",IDCANCEL,262,85,50,14
     LTEXT           "选择要注入的进程 :",IDC_STATIC,10,21,65,8
     COMBOBOX        COMBO_PROCESS,74,19,187,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
-    PUSHBUTTON      "注入DLL",BTN_INJECT,97,42,50,14
-    PUSHBUTTON      "卸载DLL",BTN_EJECT,162,42,50,14
+    PUSHBUTTON      "注入DLL",BTN_INJECT,74,35,50,14
+    PUSHBUTTON      "卸载DLL",BTN_EJECT,128,35,50,14
     PUSHBUTTON      "刷新",BTN_REFLESH,264,17,46,14
+    PUSHBUTTON      "隐藏窗口",BTN_HIDE_WND,181,35,50,14
+    PUSHBUTTON      "显示窗口",BTN_SHOW_WND,235,35,50,14
 END
 
 

+ 2 - 0
Source/InjectDLL/InjectDLL/InjectDLL.vcproj

@@ -68,6 +68,7 @@
 			<Tool
 				Name="VCLinkerTool"
 				LinkIncremental="2"
+				UACExecutionLevel="2"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				TargetMachine="1"
@@ -148,6 +149,7 @@
 			<Tool
 				Name="VCLinkerTool"
 				LinkIncremental="1"
+				UACExecutionLevel="2"
 				GenerateDebugInformation="true"
 				SubSystem="2"
 				OptimizeReferences="2"

+ 72 - 0
Source/InjectDLL/InjectDLL/InjectDLLDlg.cpp

@@ -67,6 +67,8 @@ BEGIN_MESSAGE_MAP(CInjectDLLDlg, CDialog)
     ON_BN_CLICKED(BTN_INJECT, &CInjectDLLDlg::OnBnClickedInject)
     ON_BN_CLICKED(BTN_EJECT, &CInjectDLLDlg::OnBnClickedEject)
     ON_BN_CLICKED(BTN_REFLESH, &CInjectDLLDlg::OnBnClickedReflesh)
+    ON_BN_CLICKED(BTN_HIDE_WND, &CInjectDLLDlg::OnBnClickedHideWnd)
+    ON_BN_CLICKED(BTN_SHOW_WND, &CInjectDLLDlg::OnBnClickedShowWnd)
 END_MESSAGE_MAP()
 
 
@@ -230,3 +232,73 @@ void CInjectDLLDlg::OnBnClickedReflesh()
     // TODO: 在此添加控件通知处理程序代码
     InitCommbox();
 }
+
+BOOL ShowInTaskbar(HWND hWnd, BOOL bShow)
+{
+    HRESULT hr; 
+    ITaskbarList* pTaskbarList;
+    hr = CoCreateInstance( CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER,  
+        IID_ITaskbarList, (void**)&pTaskbarList );
+    if(SUCCEEDED(hr))
+    {
+        pTaskbarList->HrInit();
+        if(bShow)
+            pTaskbarList->AddTab(hWnd);
+        else
+            pTaskbarList->DeleteTab(hWnd);
+        pTaskbarList->Release();
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+HWND g_hCurrentProWnd = NULL;
+HWND g_hCurrentProWnd2 = NULL;
+void CInjectDLLDlg::OnBnClickedHideWnd()
+{
+    // TODO: 在此添加控件通知处理程序代码
+    INT nCurSel = m_cbProcess.GetCurSel();
+    if ( nCurSel == CB_ERR )
+    {
+        MessageBox(_T("请选择要隐藏窗口的进程"), _T("提醒"), MB_ICONWARNING);
+        return;
+    }
+
+    ProInfo *ptr = (ProInfo*)m_cbProcess.GetItemDataPtr(nCurSel);
+    if ( ptr )
+    {
+        g_hCurrentProWnd = GetProcessMainWnd(ptr->dwProId, _T("Demo"));
+        //g_hCurrentProWnd = GetProcessMainWnd(ptr->dwProId, NULL);
+        if ( g_hCurrentProWnd )
+        {//(TPV 2021/09/29) UHD Series OGC Tool V2.21.1.3
+            // Demo是多窗口程序,Demo是最外层的影子窗口,Spy++无法直接获取;
+            g_hCurrentProWnd2 = GetProcessMainWnd(ptr->dwProId, _T("(TPV 2021/09/29) UHD Series OGC Tool V2.21.1.3"));
+            ::ShowWindow(g_hCurrentProWnd2, SW_HIDE);
+            ::ShowWindow(g_hCurrentProWnd, SW_HIDE);
+            //ShowInTaskbar(g_hCurrentProWnd, FALSE);
+        }
+    }
+}
+
+void CInjectDLLDlg::OnBnClickedShowWnd()
+{
+    // TODO: 在此添加控件通知处理程序代码
+    INT nCurSel = m_cbProcess.GetCurSel();
+    if ( nCurSel == CB_ERR )
+    {
+        MessageBox(_T("请选择要显示窗口的进程"), _T("提醒"), MB_ICONWARNING);
+        return;
+    }
+
+    ProInfo *ptr = (ProInfo*)m_cbProcess.GetItemDataPtr(nCurSel);
+    if ( ptr )
+    {
+        if ( g_hCurrentProWnd )
+        {
+            ::ShowWindow(g_hCurrentProWnd, SW_SHOW);
+            ::ShowWindow(g_hCurrentProWnd2, SW_SHOW);
+            //ShowInTaskbar(g_hCurrentProWnd, TRUE);
+        }
+    }
+}

+ 2 - 0
Source/InjectDLL/InjectDLL/InjectDLLDlg.h

@@ -40,4 +40,6 @@ public:
     afx_msg void OnBnClickedEject();
     afx_msg void OnBnClickedReflesh();
     CComboBox m_cbProcess;
+    afx_msg void OnBnClickedHideWnd();
+    afx_msg void OnBnClickedShowWnd();
 };

+ 7 - 1
Source/InjectDLL/InjectDLL/Injection.cpp

@@ -2,7 +2,13 @@
 #include "Injection.h"
 #include "Global.h"
 
-CInjection::CInjection()
+CInjection::CInjection():m_dwInjectPID(0),
+m_hInjectProcess(NULL),
+m_lpInjectData(NULL),
+m_lpEjectData(NULL),
+m_hInjectThread(NULL),
+m_hEjectThread(NULL),
+m_dwPathLen(0)
 {
 }
 

+ 4 - 2
Source/InjectDLL/InjectDLL/resource.h

@@ -10,8 +10,10 @@
 #define COMBO_PROCESS                   1000
 #define BTN_INJECT                      1001
 #define BTN_EJECT                       1002
-#define IDC_BUTTON1                     1003
 #define BTN_REFLESH                     1003
+#define BTN_HIDE_WND                    1004
+#define IDC_BUTTON2                     1005
+#define BTN_SHOW_WND                    1005
 
 // Next default values for new objects
 // 
@@ -19,7 +21,7 @@
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_NEXT_RESOURCE_VALUE        129
 #define _APS_NEXT_COMMAND_VALUE         32771
-#define _APS_NEXT_CONTROL_VALUE         1004
+#define _APS_NEXT_CONTROL_VALUE         1005
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif