當前位置:首頁 » 文件傳輸 » hwnd窗口能被多進程訪問嗎
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

hwnd窗口能被多進程訪問嗎

發布時間: 2022-09-10 07:45:16

① Windows窗口句柄和進程句柄詳細關系是什麼

所謂句柄實際上是一個數據,是一個Long (整長型)的數據。

句柄是WONDOWS用來標識被應用程序所建立或使用的對象的唯一整數,WINDOWS使用各種各樣的句柄標識諸如應用程序實例,窗口,控制,點陣圖,GDI對象等等。WINDOWS句柄有點象C語言中的文件句柄。

從上面的定義中的我們可以看到,句柄是一個標識符,是拿來標識對象或者項目的,它就象我們的姓名一樣,每個人都會有一個,不同的人的姓名不一樣,但是,也可能有一個名字和你一樣的人。從數據類型上來看它只是一個16位的無符號整數。應用程序幾乎總是通過調用一個WINDOWS函數來獲得一個句柄,之後其他的WINDOWS函數就可以使用該句柄,以引用相應的對象。

如果想更透徹一點地認識句柄,我可以告訴大家,句柄是一種指向指針的指針。我們知道,所謂指針是一種內存地址。應用程序啟動後,組成這個程序的各對象是住留在內存的。如果簡單地理解,似乎我們只要獲知這個內存的首地址,那麼就可以隨時用這個地址訪問對象。但是,如果您真的這樣認為,那麼您就大錯特錯了。我們知道,Windows是一個以虛擬內存為基礎的操作系統。在這種系統環境下,Windows內存管理器經常在內存中來回移動對象,依此來滿足各種應用程序的內存需要。對象被移動意味著它的地址變化了。如果地址總是如此變化,我們該到哪裡去找該對象呢?

為了解決這個問題,Windows操作系統為各應用程序騰出一些內存儲地址,用來專門登記各應用對象在內存中的地址變化,而這個地址(存儲單元的位置)本身是不變的。Windows內存管理器在移動對象在內存中的位置後,把對象新的地址告知這個句柄地址來保存。這樣我們只需記住這個句柄地址就可以間接地知道對象具體在內存中的哪個位置。這個地址是在對象裝載(Load)時由系統分配給的,當系統卸載時(Unload)又釋放給系統。

句柄地址(穩定)→記載著對象在內存中的地址————→對象在內存中的地址(不穩定)→實際對象

本質:WINDOWS程序中並不是用物理地址來標識一個內存塊,文件,任務或動態裝入模塊的,相反的,WINDOWS API給這些項目分配確定的句柄,並將句柄返回給應用程序,然後通過句柄來進行操作。

但是必須注意的是程序每次從新啟動,系統不能保證分配給這個程序的句柄還是原來的那個句柄,而且絕大多數情況的確不一樣的。假如我們把進入電影院看電影看成是一個應用程序的啟動運行,那麼系統給應用程序分配的句柄總是不一樣,這和每次電影院售給我們的門票總是不同的一個座位是一樣的道理。

線程是指程序的一個指令執行序列,WIN32 平台支持多線程程序,允許程序中存在多個線程。 在單 CPU 系統中,系統把 CPU 的時間片按照調度演算法分配給各個線程,因此各線程實際上是分時執行的,在多 CPU 的 Windows NT 系統中, 同一個程序的不同線程可以被分配到不同的 CPU 上去執行。由於一個程序的各線程是在相同的地址空間運行的,因此設及到了如何共享內存, 如何通信等問題,這樣便需要處理各線程之間的同步問題,這是多線程編程中的一個難點。

線程,也被稱為輕量進程(lightweight processes)。計算機科學術語,指運行中的程序的調度單位。

線程是進程中的實體,一個進程可以擁有多個線程,一個線程必須有一個父進程。線程不擁有系統資源,只有運行必須的一些數據結構;它與父進程的其它線程共享該進程所擁有的全部資源。線程可以創建和撤消線程,從而實現程序的並發執行。一般,線程具有就緒、阻塞和運行三種基本狀態。

在多中央處理器的系統里,不同線程可以同時在不同的中央處理器上運行,甚至當它們屬於同一個進程時也是如此。大多數支持多處理器的操作系統都提供編程介面來讓進程可以控制自己的線程與各處理器之間的關聯度(affinity)。

進程是程序在一個數據集合上運行的過程(注:一個程序有可能同時屬於

多個進程),它是操作系統進行資源分配和調度的一個獨立單位,進程可以簡單的分為系統進程(包括一般

Windows程序和服務進程)和用戶進程

② 一個進程中句柄在另一個進程中能用嗎

句柄是有用的.但是我建議你要使用其它進程的句柄用DuplicateHandle API函數

修正一下,共享句柄是無效的.因為在WINDOWS里,每個進程里都有一個進程句柄表,對應的就是自己擁有可以使用句柄.如果一個句柄共享的話,僅僅只對創建它的進程有效,而其他進程雖說獲取了相同值得句柄,但是在他們的句柄表裡沒有對應的有效句柄,那麼該值是無效的.我們都知道句柄標示的是一個資源,一個內核對象,如果需要訪問其他進程的句柄就必須用DuplicateHandle API函數
,或者OpenXXXX函數,但請記住,獲取了有效的句柄後用完必須釋放掉,不然會造成資源浪費.

③ ShowWindow(hWnd,SW_RESTORE)怎麼不能激活窗口呀

一個進程可能有多個窗口,只有一個窗口是負責顯示的
if ( pid == dwProcessID )
{
TCHAR szClassName[MAX_PATH]={0};
GetClassName(h,szClassName,MAX_PATH);
if (lstrcmp(szClassName,TEXT("WinRarWindow"))==0)
return h;
}

④ 在VC6.0中,HWND、hwnd、hWnd三者之間有什麼區別若有,那麼區別是什麼能詳細地講解一下嗎

HWND 是窗口句柄的類(handle of window)

hwnd、hWnd都是定義一個HWND的類,只不過微軟用的都是匈牙利命名法,所以微軟文檔中都是用hWnd的,hwnd估計是一般應用MFC的程序員這樣用。

⑤ MFC:在父窗口中打開了一個子窗口,然後在子窗口中訪問非父窗口的其他窗口的控制項。怎麼實現。

你的意思就是獲取子窗口句柄

1.先要獲取主窗口的句柄
獲取方法參考:

1.通過進程名稱尋找進程 獲得進程ID->枚舉所有窗口->選出進程ID的主窗口句柄

2.通過窗口名稱FindWindow出主窗口句柄

2.::GetDlgItem(這個函數可以獲取子窗口的句柄)
常式:

HWND 主窗口句柄=::FindWindow(......);

HWND 子窗口句柄=::GetDlgItem(主窗口句柄,1231);//1231是子窗口在主窗口中的ID

//可以利用GetDlgItem(子窗口句柄,111);這樣以此類推,一直到你所要的窗口為止

char 文本[MAX_PATH]={0};

::GetWindowText(子窗口句柄,文本,MAX_PATH);

MessageBox(.........);

Q:怎麼獲得子窗口在主窗口中的ID?
A:可以通過一些輔助軟體獲得,比如SPY++、精易助手 ,等等。

傳遞類的指針即可

⑥ 關於PostThreadMessage能實現進程間通信嗎

線程消息可以跨進程發,沒問題的。

不過一個線程可能擁有很多窗口,你指定一個線程ID的話,應當是哪個窗口收到呢?窗口的消息循環一般都指定了GetMessage中的窗口句柄參數,一般的窗口是收不到PostThreadMessage郵寄的消息的。(個人見解)

我平時給線程發消息一般都是針對有「消息循環...

感謝回答,不過你第一句話好像說的就不太對吧?消息循環是針對線程的,並非針對窗口吧,postthreadmessage是給某個線程消息循環發消息,SendMessage的第一個參數就是給哪個窗口發,第二個參數才是消息類型,這樣,某個線程從他的消息循環中取出消息的時候,MSG本身就包含了hwnd,所以完全不存在你說的那個問題吧。
自己仔細看了幾個函數的MSDN,得到了一個簡單的「結論」(不對,歡迎評判):
1
BOOL PostThreadMessage( DWORD idThread,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);

The PostThreadMessage function posts a message to the message queue of the specified thread. It returns without waiting for the thread to process the message.

說了,是給消息隊列的某個線程。
2 DWORD GetWindowThreadProcessId( HWND hWnd,
LPDWORD lpdwProcessId
);

The GetWindowThreadProcessId function retrieves the identifier of the thread that created the specified window and, optionally, the identifier of the process that created the window.

參照一下參數返回信息。

Parameters

hWnd
[in]Handletothewindow.
lpdwProcessId
[out].IfthisparameterisnotNULL,;otherwise,itdoesnot.
ReturnValue

.