隠しウィンドウを作成する方法は?
このウィンドウの目的は、いくつかのメッセージを受信することです。
ウィンドウを作成するときは、WS_VISIBLEフラグを省略し、ShowWindowを呼び出さないでください。
Win32/mfc環境では、次のようにクラスを作成してCWndから継承する必要があります。
class HiddenMsgWindow : public CWnd
{
...
}
そのクラスのコンストラクターでは、次のようにウィンドウをインスタンス化します。
HiddenMsgWindow::HiddenMsgWindow()
{
CString wcn = ::AfxRegisterWndClass(NULL);
BOOL created = this->CreateEx(0, wcn, _T("YourExcellentWindowClass"), 0, 0, 0, 0, 0, HWND_MESSAGE, 0);
}
これにより、メッセージポンプを備えた隠しウィンドウがロックされ、回転する準備がほぼ整います。
ストーリーの残りの部分は、ウィンドウメッセージとそれらのメッセージのハンドラー間のリンクを提供することです。
これは、次のように、いくつかのマクロとメッセージハンドラーを実装ファイル(.cpp)に追加することで行われます。
BEGIN_MESSAGE_MAP(HiddenMsgWindow, CWnd)
ON_MESSAGE(WM_USER + 1, DoNOOP)
END_MESSAGE_MAP()
LRESULT HiddenMsgWindow::DoNOOP(WPARAM wParam, LPARAM lParam)
{
AfxMessageBox(_T("Get Reaaady for a Ruuummmmmmmbllllle!"));
return LRESULT(true);
}
次に、次のようにヘッダーファイルに残りの接着剤を入力する必要があります。
class HiddenMsgWindow : public CWnd
{
public:
HiddenMsgWindow();
protected:
afx_msg LRESULT DoNOOP(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
}
まるで魔法のように、メッセージを送り出す準備ができている隠しウィンドウがあります。
このメッセージウィンドウを使用するには、クラスをインスタンス化してハンドルを取得し、必要に応じてメッセージを送信または送信します。ちょうどこのような:
HiddenMsgWindow *hmw = new HiddenMsgWindow();
SendMessage(hmw->m_hWnd, WM_USER + 1, 0, 0);
通常どおりCreateWindow()
またはCreateWindowEx()
を呼び出しますが、_WS_VISIBLE
_ウィンドウスタイルは指定しません。もちろん、ShowWindow()
も呼び出すべきではありません。
ウィンドウを表示する必要がない場合は、ウィンドウの作成を提案する人もいますが、WS_VISIBLEフラグを省略し、ShowWindowを呼び出さないでください。
showWindow()を呼び出すときにそうでない場合は、SW_HIDEパラメータを追加します。
ShowWindow(hWnd, SW_HIDE);
ああ、ちょうど問題が発生しました。 HWND_MESSAGEの指定に失敗すると、予期しない動作が発生する可能性があります。正しくないNULLを使用しました。私の場合、MS Excelがxlsファイルをロードするのに10秒以上かかっていましたが、アプリが実行されていないときは通常1秒未満で完了しました。
MSDNは前に誰かが述べたようにこれを言います。