首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 記事本搜尋功能:打開檔案後搜尋無反應,句柄獲取失敗分析

     編輯:程式設計綜合問答

問題現象

  • 手動輸入文字 → 搜尋 **正常顯示** 結果。
  • 使用「打開」載入文字檔 → 搜尋 **無任何反應**,結果不顯示。

根本原因

NotePad 視窗句柄 (HWND) 未正確取得。程式可能在檔案載入後、視窗標題改變前嘗試 FindWindow,導致取得 NULL 句柄,後續 SendMessage(WM_FIND...) 發送給無效目標。

常見錯誤模式

// 錯誤:檔案剛載入,標題可能還是 "無標題 - 記事本"
HWND hNotepad = FindWindow("Notepad", null);
// 或硬編碼標題
HWND hNotepad = FindWindow(null, "無標題 - 記事本");

解決方案

  1. 延遲重試:檔案載入後 Thread.sleep(500~1000),等待視窗標題更新 (通常會顯示檔名)。
  2. 枚舉視窗:用 EnumWindows 遍歷所有頂層視窗,比對類別名 "Notepad" 且可見、非最小化者。
  3. UI Automation / Accessibility:改用 Java Access Bridge 或 JNA 呼叫 IAccessible,不依賴標題字串。
  4. 同步機制:若是自家開發的記事本,建議改用 Socket、共享記憶體或檔案監聽傳遞搜尋指令,避免脆弱的視窗訊息傳遞。

程式碼片段 (JNA 枚舉視窗)

import com.sun.jna.platform.win32.*;
import com.sun.jna.platform.win32.WinDef.HWND;

public HWND findNotepad() {
    final HWND[] result = {null};
    User32.INSTANCE.EnumWindows((hWnd, lParam) -> {
        char[] title = new char[512];
        User32.INSTANCE.GetWindowText(hWnd, title, title.length);
        String titleStr = Native.toString(title).trim();
        char[] cls = new char[256];
        User32.INSTANCE.GetClassName(hWnd, cls, cls.length);
        String clsStr = Native.toString(cls).trim();
        if ("Notepad".equals(clsStr) && !titleStr.isEmpty() && User32.INSTANCE.IsWindowVisible(hWnd)) {
            result[0] = hWnd;
            return false; // 停止枚舉
        }
        return true;
    }, 0);
    return result[0];
}

採用穩健的句柄獲取策略,即可解決「打開檔案後搜尋失效」的問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved