|
了解しました。
ご検討のほどよろしくお願いします。
そういえば、HM32CLIENTで思い出しましたが、
(HM32CLIENTの方ではなく) hidemaruhandle(0) 相当をC層で得るのが
実はちょっと得にくいように思っているのですが、
今は以下のようにしているのですが、普通もっとサクッと
行きそうな気もするのですが何か手立てはありますか?
(マクロから渡すとかではなく)
//--------------------------------------------------- hidemaruexe_handle.h
#pragma once
#include <windows.h>
#include <string>
using namespace std;
extern HWND GetCurWndHidemaru();
// ストアアプリ版も考慮して鋳型にしておく
class HidemaruWindowHandleSearcher {
public:
HidemaruWindowHandleSearcher(wstring strClassName);
private:
// これはスタティックではない。デスクトップ版とアプリ版があるので
wstring m_strClassName;
// 秀丸ハンドル
HWND hCurWndHidemaru;
public:
HWND GetCurWndHidemaru();
private:
bool IsWndHidemaru32ClassType(HWND hWnd);
void SearchCurWndHidemaru(HWND hWnd);
};
//--------------------------------------------------- hidemaruexe_handle.cpp
#include <windows.h>
#include "hidemaruexe_handle.h"
HidemaruWindowHandleSearcher::HidemaruWindowHandleSearcher(wstring strClassN
ame) {
this->m_strClassName = strClassName;
this->hCurWndHidemaru = NULL;
}
HWND HidemaruWindowHandleSearcher::GetCurWndHidemaru() {
if (!hCurWndHidemaru) {
SearchCurWndHidemaru(GetDesktopWindow());
}
return this->hCurWndHidemaru;
}
bool HidemaruWindowHandleSearcher::IsWndHidemaru32ClassType(HWND hWnd) {
wchar_t strTargetClassName[MAX_CLASS_NAME];
::GetClassName(hWnd, strTargetClassName, _countof(strTargetClassName));
if (m_strClassName == strTargetClassName) {
return true;
}
return false;
}
void HidemaruWindowHandleSearcher::SearchCurWndHidemaru(HWND hWnd)
{
if (hCurWndHidemaru) { return; }
HWND hWndParent = GetParent(hWnd);
// 自分自身の親も指定のクラス名
if (IsWndHidemaru32ClassType(hWndParent))
{
// 自分のプロセスIDと、サーチ対象のプロセスID
DWORD pID1 = GetCurrentProcessId();
DWORD pID2 = 0;
GetWindowThreadProcessId(hWnd, &pID2);
// 同じならこれだこれ
if (pID1 == pID2) {
hCurWndHidemaru = hWnd;
}
}
// 子クラスをなめていく。子クラスはあくまでも「Hidemaru32Class系」。
// ストア版はちょっと違うのでインスタンス変数になっている。
HWND hWndChild = FindWindowEx(hWnd, NULL, m_strClassName.c_str(), NULL);
while (hWndChild != NULL)
{
SearchCurWndHidemaru(hWndChild);
if (hCurWndHidemaru) { break; }
hWndChild = ::FindWindowEx(hWnd, hWndChild, m_strClassName.c_str(), NULL);
}
}
// ★この関数でhidemarunandle(0)相当を得る。
static HWND hWnd = NULL;
HWND GetCurWndHidemaru() {
if (!hWnd) {
// 普通の秀丸
HidemaruWindowHandleSearcher s1(L"Hidemaru32Class");
hWnd = s1.GetCurWndHidemaru();
}
if (!hWnd) {
// ストアアプリ版
HidemaruWindowHandleSearcher s2(L"Hidemaru32Class_Appx");
hWnd = s2.GetCurWndHidemaru();
}
return hWnd;
}
「なぜ自分でサーチする羽目になっているのだろう…」と
疑問には思っているのですが…
|
|