c++ windows app激活另一app的某窗口
来源:互联网 发布:单片机最小系统图片 编辑:程序博客网 时间:2024/05/23 20:21
激活application.exe 窗口标题1/窗口标题2/窗口标题3中的一个,先找到先激活。
调用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 = 5HWND wnd_handle_;//main window handleint actual_window_count_ = 0;//max window count wchar_t *window_title_[MAX_WINDOW_COUNT]={nullptr};//title of each main windowbool 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 methodsplitString(titles);EnumWindows((WNDENUMPROC)enumWindowsProc,process_id);//delete the titlesreleaseTitles();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 pathwchar_t *process_path = new wchar_t[MAX_PATH*2];//get process pathif(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_titleif (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 titlesreleaseTitles();//new titleswchar_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");}
0 0
- c++ windows app激活另一app的某窗口
- 另一app store 网站
- 从一个App跳转到另一APP
- Windows Phone app的生命周期
- 将App激活成超级管理员
- APP被kill后重新激活的几种方案
- 如何解决激活Project Web App feature失败的解决方案
- 自定义About App窗口
- 多窗口IOS App
- 【转】从一个App跳转到另一APP
- Windows下,Qt激活指定句柄的窗口
- iOS 激活APP时通知APP开始获取用户位置
- Windows Phone app的设计过程
- [转]Windows Phone app的设计过程
- 新玩的windows phone app studio
- 新玩的windows phone app studio
- 【WPF】Windows App 比例布局的实现
- 如何卸载Windows 10 内置的App
- 工作笔记
- javascript模块化编程三(requirejs入门补充一):模块化编程
- 一次非常诡异的WebView js失效问题
- apktools反汇编安卓apk工具
- crontab命令
- c++ windows app激活另一app的某窗口
- Javascript模块化编程(一):模块的写法
- 经典面试题之复杂链表复制的简单实现
- 下载安装开发者版本LeapMotion驱动及SDK
- C++primer plus第六版课后编程练习答案3.4
- C语言实现链表之双向链表(六)删除头结点
- NYOJ 290 动物统计加强版 (字典树)
- QT Design Form 积累
- Fragment你应该知道的一切