我正在嘗試WM_CLOSE從我的應用程式發送到目標應用程式以告訴它關閉。我在 NET 6.0 上的 VS 除錯器中運行。
我找到目標應用程式的WM_CLOSE句柄并向其句柄發送訊息,但是 Spy 說訊息永遠不會到達目標視窗,因此目標視窗當然不會關閉。
我知道我有正確的目標句柄,因為我可以在 Spy 中看到它(我使用 Spy 十字準線手動標記目標視窗標題欄),并且它們匹配。此外,當我從句柄獲取視窗標題時,它會在目標應用程式的標題欄中提供相同的視窗標題。呼叫的回傳碼PostMessage為零,所以PostMessage說它發送了訊息。
但既不PostMessage也不SendMessage發送在 Spy 滾動顯示中實時記錄的目標視窗的訊息中可見的訊息。
為什么我的WM_CLOSE訊息不是:(1)在 Spy 中可見,(2)沒有到達目標應用程式?
public static void
SendCloseToHandle(IntPtr handle) {
var result = PostMessage(handle, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
if (result != 0) {
FormAppendTextContent($"WM_CLOSE failed to send. {result:X}");
return;
}
//SendMessage(handle, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
var title = GetWindowTitle(handle);
FormAppendTextContent($"Posted WM_CLOSE message to {title} '{handle:X}'");
}
uj5u.com熱心網友回復:
PostMessage 呼叫的回傳碼為零,因此 PostMessage 表示它發送了訊息。
那是錯誤的。該PostMessage函式在失敗時回傳零。因此,假設您的代碼(如所示)未顯示錯誤訊息,則PostMessage呼叫失敗,并且WM_CLOSE未發送到目標。
您需要更改要使用的錯誤處理if (result == 0) { ...,然后在該塊中呼叫該GetLastError函式以檢索錯誤代碼。如果是這樣5(我懷疑),那么由于 UIPI 訪問不正確,呼叫失敗,您需要按照本 Q/A 中所述解決該問題:跨行程 PostMessage、UIPI 限制和 UIAccess=”true”。
注意:GetLastError從 C# 和/或 .Net 專案呼叫 WinAPI 函式并非易事;有關如何正確執行此操作的深入討論,請參見此處:WinApi - GetLastError vs. Marshal.GetLastWin32Error。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/493357.html
