將兩個不同程序的視窗設定為父子關係

2021-09-08 22:22:51 字數 970 閱讀 4251

今天用wpf程式給乙個第三方程式做外掛程式,該程式支援通過選單擴充套件的方式整合第三方程式,看起來像是彈出乙個對話方塊。

但是,由於新寫的wpf程式和原程式是沒有任何關係的,一旦原程式重新獲取焦點時,新彈出的wpf程式視窗就會切換到後台,看起來就不像子視窗了。看了一下之前的人們的做法,大多是將新蹦出來的視窗設定為topmost,但這樣就又引入了改視窗不能切換到後台隱藏的問題。

在網上搜了一下,找到了如下解決方法:具體就是通過windowinterophelper將外部視窗設定為owner。

varhelper = newwindowinterophelper(mywpfchildwindow);

helper->owner= mainwindowhwnd;

這樣做確實解決問題了,但反過來一想,如果要讓外部視窗作為wpf的子視窗,就無法用這個方法了。由於wpf程式本身就是呼叫的windowsapi,肯定windowsapi是支援兩個不相干的視窗的父子關係設定的,便在referencesource上看了一下其原始碼,用的是如下**:

unsafenativemethods.setwindowlong(new handleref(null, criticalhandle),

nativemethods.gwl_hwndparent,    

_ownerhandle);

也就是說,它呼叫的是api setwindowlong:

long winapi setwindowlong(

_in_ hwnd hwnd,

_in_ intnindex,

_in_ long dwnewlong

);它有三個引數,第乙個引數傳入子視窗handle, 第二個引數傳入gwl_hwndparent,第三個傳入父視窗handle。不過,msdn上同時寫著不建議使用這種方式設定父子關係,而需要用setparent。我試了一下,用這種方式可以,反而用setparent不行,既然微軟自己都在用,暫且先用著,後續發現有問題再補充說明。

兩個Form視窗之間的傳值(父 子)(子 父)

首先定義兩個form,乙個為form1,乙個為form2,其中form1作為父視窗,form2作為子視窗 1 父視窗傳值給子視窗 form1中 public form1 private void button1 click object sender,eventargs e form2中 priva...

將Git工程提交到兩個不同的倉庫

使用場景 有兩種配置方式,直接看配置檔案 修改專案.git檔案下的config檔案 提交到兩個倉庫的相同分支 core repositoryformatversion 0 filemode false bare false logallrefupdates true symlinks false i...

將Git工程提交到兩個不同的倉庫

使用場景 有兩種配置方式,直接看配置檔案 修改專案.git檔案下的config檔案 提交到兩個倉庫的相同分支 1 core 2 repositoryformatversion 0 3 filemode false 4 bare false 5 logallrefupdates true 6 syml...