Skip to content

Commit c64465b

Browse files
committed
DoGrepテストのMYWM_UIPI_CHECK失敗対策
トレイウインドウからのメッセージ返送が失敗するため。
1 parent 4cd960b commit c64465b

4 files changed

Lines changed: 41 additions & 9 deletions

File tree

sakura_core/_main/CControlTray.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,8 +444,10 @@ LRESULT CControlTray::DispatchEvent(
444444

445445
case MYWM_UIPI_CHECK:
446446
/* エディタ-トレイ間でのUI特権分離の確認メッセージ */ // 2007.06.07 ryoji
447+
std::wcout << L"[UIPI] >>>> MYWM_UIPI_CHECK: hwndEdit=" << (ULONG_PTR)lParam << std::endl;
447448
::SendMessage( (HWND)lParam, MYWM_UIPI_CHECK, (WPARAM)0, (LPARAM)0 ); // 返事を返す
448-
return 0L;
449+
std::wcout << L"[UIPI] <<<< MYWM_UIPI_CHECK: lParam=" << (ULONG_PTR)lParam << std::endl;
450+
return lParam;
449451

450452
case MYWM_HTMLHELP:
451453
{

sakura_core/window/CEditWnd.cpp

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
Copyright (C) 2010, ryoji, Moca、Uchi
1919
Copyright (C) 2011, ryoji
2020
Copyright (C) 2013, Uchi
21-
Copyright (C) 2018-2022, Sakura Editor Organization
21+
Copyright (C) 2018-2026, Sakura Editor Organization
2222
2323
SPDX-License-Identifier: Zlib
2424
*/
@@ -666,6 +666,11 @@ HWND CEditWnd::Create(
666666
// 画面表示直前にDispatchEventを有効化する
667667
::SetWindowLongPtr( GetHwnd(), GWLP_USERDATA, (LONG_PTR)this );
668668

669+
MSG msg{};
670+
671+
// メッセージキューを作成する
672+
::PeekMessageW(&msg, hWnd, WM_USER, WM_USER, PM_NOREMOVE);
673+
669674
// デスクトップからはみ出さないようにする
670675
_AdjustInMonitor(sTabGroupInfo);
671676

@@ -677,17 +682,30 @@ HWND CEditWnd::Create(
677682
m_bIsActiveApp = ( ::GetActiveWindow() == GetHwnd() ); // 2007.03.08 ryoji
678683

679684
// エディタ-トレイ間でのUI特権分離の確認(Vista UIPI機能) 2007.06.07 ryoji
680-
{
681-
m_bUIPI = FALSE;
682-
::SendMessage( m_pShareData->m_sHandles.m_hwndTray, MYWM_UIPI_CHECK, (WPARAM)0, (LPARAM)GetHwnd() );
683-
if( !m_bUIPI ){ // 返事が返らない
685+
if (const auto hWndTray = m_pShareData->m_sHandles.m_hwndTray) {
686+
std::wcout << L"[UIPI] >> Send From: hwndEdit = " << (ULONG_PTR)hWnd << L" To hwndTray = " << (ULONG_PTR)hWndTray << std::endl;
687+
688+
// 戻り値取得用変数(成功するとhWndが返って来る)
689+
DWORD_PTR dwRes = 0;
690+
691+
// コントロールプロセスにMYWM_UIPI_CHECKを送る
692+
::SendMessageTimeoutW(hWndTray, MYWM_UIPI_CHECK, 0L, LPARAM(hWnd), SMTO_NORMAL, 10000, &dwRes);
693+
694+
// メッセージ返送を回収する(とれない場合もあるが問題はない。)
695+
::PeekMessageW(&msg, hWnd, MYWM_UIPI_CHECK, MYWM_UIPI_CHECK, PM_REMOVE | PM_QS_SENDMESSAGE);
696+
697+
std::wcout << L"[UIPI] << Send Result: dwRes = " << dwRes << std::endl;
698+
699+
if (!dwRes) { // 送信失敗
700+
std::wcout << L"[UIPI] No Response" << std::endl;
684701
TopErrorMessage( GetHwnd(),
685702
LS(STR_ERR_DLGEDITWND02)
686703
);
687704
::DestroyWindow( GetHwnd() );
688705
m_hWnd = hWnd = nullptr;
689706
return hWnd;
690707
}
708+
std::wcout << L"[UIPI] m_bUIPI=TRUE" << std::endl;
691709
}
692710

693711
CShareData::getInstance()->SetTraceOutSource( GetHwnd() ); // TraceOut()起動元ウィンドウの設定 // 2006.06.26 ryoji
@@ -1527,8 +1545,8 @@ LRESULT CEditWnd::DispatchEvent(
15271545

15281546
case MYWM_UIPI_CHECK:
15291547
/* エディタ-トレイ間でのUI特権分離の確認メッセージ */ // 2007.06.07 ryoji
1530-
m_bUIPI = TRUE; // トレイからの返事を受け取った
1531-
return 0L;
1548+
std::wcout << L"[UIPI] ------ MYWM_UIPI_CHECK" << std::endl;
1549+
return LRESULT(lParam);
15321550

15331551
case MYWM_CLOSE:
15341552
/* エディタへの終了要求 */

sakura_core/window/CEditWnd.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,6 @@ class CEditWnd
418418
CDropTargetHolder m_pcDropTarget = std::make_unique<CDropTarget>(this); //!< 右ボタンドロップ用
419419

420420
//その他フラグ
421-
BOOL m_bUIPI; // エディタ-トレイ間でのUI特権分離確認用フラグ // 2007.06.07 ryoji
422421
EIconClickStatus m_IconClicked = icNone;
423422

424423
public:

src/test/cpp/tests1/test-winmain.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -777,6 +777,19 @@ TEST_P(WinMainTest, DoGrep001)
777777
// テスト用プロファイル名
778778
const auto profileName(GetParam());
779779

780+
// ケース独自の設定ファイルを使うので、一旦削除する
781+
std::filesystem::remove(iniPath);
782+
783+
// テスト用INIファイル作成
784+
// 常駐設定にしないとコントロールプロセスが落ちてしまうので設定を入れる
785+
constexpr std::array iniLines = {
786+
// 全般設定を出力
787+
u8"[Common]"sv,
788+
u8"bTaskTrayStay=1"sv, // コントロールプロセスを常駐させる
789+
u8"szLanguageDll="sv, // 言語DLLの指定(空にすると日本語になる)
790+
};
791+
cxx::writeTextFile(iniPath, iniLines);
792+
780793
// コントロールプロセスを起動する
781794
const auto dwControlProcessId = testing::CreateControlProcess(profileName);
782795

0 commit comments

Comments
 (0)