1

このコードは単純な FindText ダイアログ ウィンドウを生成し、ユーザーが右上の X ウィンドウの閉じるボタンをクリックすると WM_CLOSE メッセージがフック プロシージャに送信されますが、[キャンセル] ボタンをクリックしても、ウィンドウが閉じられたことを示すメッセージは生成されません。

#include <windows.h>
#include <iostream>
#include <iomanip>

UINT_PTR CALLBACK FRHookProc(HWND hdlg, UINT uiMsg, WPARAM /*wParam*/, LPARAM /*lParam*/) {
  switch (uiMsg) {
    case WM_INITDIALOG: {
      ShowWindow(hdlg, SW_SHOW);
      break;
    }
  }
  using namespace std;
  if (uiMsg == WM_CLOSE) cout << "FindTextW window has been closed";
  return 0;
}

LRESULT CALLBACK MyWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  return DefWindowProcW(hWnd, Msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int /* nCmdShow*/) {
  using namespace std;

  WNDCLASSEXW wc;
  wc.cbSize = sizeof(WNDCLASSEXW);
  wc.style = CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc = &MyWndProc;
  wc.cbClsExtra = 0;
  wc.cbWndExtra = sizeof(PVOID);
  wc.hInstance = hInstance;
  wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  wc.hIconSm = NULL;
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  wc.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_BACKGROUND);
  wc.lpszMenuName = L"MainMenu";
  wc.lpszClassName = L"window";
  ATOM class_atom = RegisterClassExW(&wc);

  HWND hWnd = CreateWindowExW(
    0,
    reinterpret_cast<LPCWSTR>(class_atom),
    L"window title",
    WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPCHILDREN | WS_THICKFRAME,
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    NULL,
    NULL,
    hInstance,
    NULL
  );

  WCHAR szFindWhat[MAX_PATH] = {0};

  FINDREPLACEW fr;
  ZeroMemory(&fr, sizeof(fr));
  fr.lStructSize = sizeof(fr);
  fr.hwndOwner = hWnd;
  fr.lpstrFindWhat = szFindWhat;
  fr.lpfnHook = FRHookProc;
  fr.wFindWhatLen = MAX_PATH;
  fr.Flags = FR_ENABLEHOOK;
  /*HWND hdlg =*/ FindTextW(&fr);

  MSG msg;
  for (;;) {
    GetMessageW(&msg, 0, 0, 0);
    TranslateMessage(&msg);
    DispatchMessageW(&msg);
  }
  return 0;
}
4

2 に答える 2

0

WM_COMMANDキャンセル ボタンのBN_CLICKEDメッセージの通知を受け取っているはずです。「キャンセル」が押されると、IDCANCEL コントロール ID の通知を受け取るはずです。

于 2013-05-01T20:07:10.790 に答える