在實際場景中會有自身程式在呼叫第三方的動態庫過程中,因為第三方的動態庫彈框導致執行緒阻塞,必須手動將彈窗關閉後才能回到自身程式的主線程中。
最簡單的場景就是很多自助裝置,本身是沒有固定操作員的,如果使用者在看到彈框後沒有手動點選關閉則彈框會一直會存在。
1、通過windows提供的api,findwindow(通過window的title)獲取到第三方彈框控制代碼,通過sendmessage向winwos發起關閉該控制代碼的命令;
2、如果該彈框有「關閉「按鈕,則通過findwindow獲取到控制代碼後,再通過findwwindowex找到「關閉」按鈕子控制代碼,然後通過sendmessage發起滑鼠左擊事件;
方案1:
/// /// 尋找系統的全部視窗///
///
public windowinfo getalldesktopwindows()
, 0);
return wndlist.toarray();
}/// /// 根據指定視窗標題暴力乾掉這個視窗
///
/// window的標題
/// 指定多少秒後關閉window
///
public async task killwindow(string windowtitle, int second = 3)
break;}}
#endregion
}catch (exception)
}
方案二:
/// /// 根據指定視窗標題暴力乾掉這個視窗///
/// window的標題
/// 指定多少秒後關閉window
///
public async task killwindowandbtn(string windowtitle, int second = 3, string btntxt = "否(&n)")
break;}}
#endregion
}catch (exception)
}
呼叫方式(第一種方案):
private async void killcarderrorwindow()
呼叫第二種方案:
//////殺掉醫保讀卡dll生成的window
/// private
async
void
killpasswordwindow()
ps: 無論使用哪一種方案,都必須在呼叫第三方api之前先發起殺掉window的方法,留意**即可知道,都是通過非同步執行的。
所以結合實際場景需要,請先設定task.delay的時間值。
乙個小鉤子程式
include include include hook.h hinstance hinst hhook hhook bool winapi dllmain hinstance hinstdll,dword dwreason,lpvoid lpreserved return true bool dl...
彙編 通過子程式交換兩個記憶體變數
交換 esi edi 兩個記憶體變數 moveax,esi xchg eax,edi mov esi eax 功能 使用子程式交換兩個記憶體變數 include vcio.inc data num1 dword 1234 num2 dword 5678 str output byte num1 d,...
通過程序控制代碼關閉某個程式的程序
下面是具體 總共分為兩個過程 enumproctree 主要用來列舉控制代碼樹 killproc 關閉某個程式的程序 procedure enumproctree const pid dword out pid tree tpidtree procedure listtree rootpid dwo...