c++ windows app激活另一app的某窗口
2015-11-24 17:17
344 查看
激活application.exe 窗口标题1/窗口标题2/窗口标题3中的一个,先找到先激活。
调用ShowBondMainWindow()即可
调用ShowBondMainWindow()即可
#include "showmainwindow.h" #include <Windows.h> #include <Psapi.h> #pragma comment (lib, "Psapi.lib") //define members #define MAX_WINDOW_COUNT 10 //support possible main window = 5 HWND wnd_handle_; //main window handle int actual_window_count_ = 0; //max window count wchar_t *window_title_[MAX_WINDOW_COUNT]={nullptr};//title of each main window bool showProcessMainWindow(const wchar_t* process_name, const wchar_t* require_process_path, const wchar_t* titles) { DWORD process_id = 0; if (!isExistingProcess(process_name, require_process_path, process_id)) { return false; } //set window_title_ for enumWindowsProc method splitString(titles); EnumWindows((WNDENUMPROC)enumWindowsProc,process_id); //delete the titles releaseTitles(); ShowWindow(wnd_handle_, SW_SHOWNORMAL); SetForegroundWindow(wnd_handle_); return true; } bool isExistingProcess(const wchar_t* process_name,const wchar_t* require_process_path, DWORD &process_id ) { DWORD aProcesses[1024], cbNeeded, cProcesses; unsigned int i; if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded )) return false; cProcesses = cbNeeded / sizeof(DWORD); DWORD current_process = GetCurrentProcessId(); for ( i = 0; i < cProcesses; i++ ) { if( aProcesses[i]!=0 && aProcesses[i]!=current_process ) { if(matchProcessNameAndID(aProcesses[i], process_name, require_process_path)) { process_id = aProcesses[i]; return true; } } } return false; } bool matchProcessNameAndID(DWORD process_id, const wchar_t * process_name, const wchar_t *require_process_path /*= nullptr*/) { wchar_t cur_process_name[MAX_PATH] = L"unknown"; bool ret = false; HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, process_id ); if (nullptr == hProcess ) { return false; } HMODULE hMod; DWORD cbNeeded; if (EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) ) { if (GetModuleBaseName(hProcess, hMod, cur_process_name,sizeof(cur_process_name)/sizeof(wchar_t))) { if (!wcscmp(cur_process_name, process_name)) { if(nullptr != require_process_path) { //required process path wchar_t *process_path = new wchar_t[MAX_PATH*2]; //get process path if(getProcessPath(process_id, process_path)) { if(isSamePath(require_process_path, process_path)) { ret = true; } } delete []process_path; } else { ret = true; } } } } CloseHandle(hProcess); return ret; } BOOL CALLBACK enumWindowsProc(HWND hwnd, DWORD lParam) { DWORD mpid; GetWindowThreadProcessId(hwnd,&mpid); if (mpid == lParam) { int i = GetWindowTextLength(hwnd); wchar_t current_title[255]; GetWindowTextW(hwnd, current_title, i+1); for(int j=0; j<actual_window_count_; j++) { //search for the first occurrence of window_title_[j] in current_title if (wcsstr(current_title, window_title_[j])) { wnd_handle_ = hwnd; return false; } } } return true; } void splitString(const wchar_t *source) { wchar_t *src = new wchar_t[1024]; wcscpy(src, source); //delete titles releaseTitles(); //new titles wchar_t *delimit = wcstok(src, L";"); while (delimit != nullptr && actual_window_count_< MAX_WINDOW_COUNT ) { int len = wcslen(delimit); window_title_[actual_window_count_] = new wchar_t[len+1]; wcscpy(window_title_[actual_window_count_],delimit); delimit = wcstok(nullptr, L";"); actual_window_count_++; } delete []src; } void releaseTitles() { for(int i = 0; i<actual_window_count_; i++) { delete[] window_title_[i]; window_title_[i] = nullptr; } actual_window_count_ = 0; } bool getProcessPath(DWORD process_id, wchar_t *file_path) { if(nullptr == file_path) { return false; } bool ret = false; HANDLE processHandle = nullptr; processHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, process_id); if (processHandle != nullptr) { if (!GetModuleFileNameExW(processHandle, NULL, file_path, MAX_PATH)) { wprintf(L"Failed to get module filename.\n"); } else { wprintf(L"Module filename is: %s\n", file_path); ret = true; } CloseHandle(processHandle); } else { wprintf(L"Failed to open process.\n"); } return ret; } bool isSamePath(const wchar_t *src, const wchar_t *des) { bool ret = false; while(*src && *des) { if(*src != *des) { if (!(*src == L'\\' || *src == L'/') &&(*des == L'\\' || *des == L'/')) { return false; } } src++; des++; } if(*src == 0 || *src == 0) { ret = true; } return ret; } void ShowAppMainWindow() { showProcessMainWindow(L"application.exe", nullptr, L"窗口标题1;窗口标题2;窗口标题3"); }
相关文章推荐
- apktools反汇编安卓apk工具
- 一次非常诡异的WebView js失效问题
- Android中Bitmap,byte[],Drawable相互转化
- iOS 页面间的传值方式
- 一个支付账号绑定两个应用的问题(支付宝和微信支付)
- 将androidVNC项目导入ADT
- Android studio中getVersionName一直都是1.0
- Android 输入系统之InputDispatcher2ViewRootImpl篇----终
- iOS对文件的操作(沙盒)
- Android 6.0发布大会来了,来看看Android 6.0棉花糖新特性
- android中?attr/**与@drawable/**或@color/**等的区别
- 添加Android系统功能
- Swift中的反射
- Android Studio打包、获取SHA1和MD5值
- 【学习笔记】Android PopupWindow使用
- Android开发笔记(六)可变字符串
- iOS 定位 相册 短信 权限检查
- iOS开发笔记-tabbar图标设成用户头像
- Android序列帧播放动画(撞钟效果)
- Android 四大组件之 Service