こんにちは。ツールボタンのどの情報を取りたいのでしょうか。
SendMessage() TB_???のメッセージで情報を受け取る際、構造体等のポインタを必要とするものが多数ありますが、他プロセスのウィンドウハンドルに向かって此方側のポインタを渡してみた所で、向こう側からしてみれば「寝耳に水」も良い所です。
プロセス間共有メモリを仲介して、データをやり取りする事になります。どちらにしろ、そんな簡単な事ではありません。
以下ではVirtualAllocEx()を使用していますが、windows xpで上手くいくかはわかりません(windows 2000sp4の上では上手くいっています)。
参考資料程度に。
#include<tchar.h>
#include<windows.h>
#include<commctrl.h>
#include<stdio.h>
typedef struct ProcessMemory
{
DWORD dwProcessID;
DWORD dwThreadID;
HANDLE hProcess;
union
{
LPVOID pVoid;
LPBYTE pByte;
LPARAM lParam;
};
} PROCESSMEMORY, *LPPROCESSMEMORY;
static BOOL OpenProcessMemory(LPPROCESSMEMORY p, HWND hWndOutProcess, DWORD dwSize)
{
p->dwThreadID = ::GetWindowThreadProcessId(hWndOutProcess, &p->dwProcessID);
if(!p->dwThreadID || !p->dwProcessID)
return FALSE;
p->hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, p->dwProcessID);
if(!p->hProcess)
return FALSE;
p->pVoid = ::VirtualAllocEx(p->hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);
return p->pVoid != NULL;
}
static BOOL CloseProcessMemory(LPPROCESSMEMORY p)
{
if(!p->hProcess)
return FALSE;
::VirtualFreeEx(p->hProcess, p->pVoid, 0, MEM_RELEASE);
::CloseHandle(p->hProcess);
::ZeroMemory(p, sizeof(PROCESSMEMORY));
return TRUE;
}
static DWORD WriteProcessMemory(LPPROCESSMEMORY p, DWORD dwByteOfOffset, const void* pIn, DWORD dwSizeOfIn)
{
DWORD dwLen = 0;
::WriteProcessMemory(p->hProcess, &p->pByte[dwByteOfOffset], pIn, dwSizeOfIn, &dwLen);
return dwLen;
}
static DWORD ReadProcessMemory(const LPPROCESSMEMORY p, DWORD dwByteOfOffset, void* pOut, DWORD dwSizeOfOut)
{
DWORD dwLen = 0;
::ReadProcessMemory(p->hProcess, &p->pByte[dwByteOfOffset], pOut, dwSizeOfOut, &dwLen);
return dwLen;
}
int main()
{
//見つかっているものとする
HWND hWndOutProcess = ::FindWindow(_T("Afx:400000:b:10011:6:7042d"), NULL);
HWND hWndCtlBar = ::FindWindowEx(hWndOutProcess, NULL, _T("AfxControlBar42d"), NULL);
HWND hWndToolBar = ::FindWindowEx(hWndCtlBar, NULL, TOOLBARCLASSNAME, NULL);
//他プロセスのメインウィンドウ
PROCESSMEMORY pm = {0};
::OpenProcessMemory(&pm, hWndOutProcess, sizeof(TBBUTTON));
//他プロセスのツールバーの数を取る
const int count = ::SendMessage(hWndToolBar, TB_BUTTONCOUNT, 0, 0);
for(int i = 0; i < count; ++i)
{
//受け皿
TBBUTTON tbb = {0};
//プロセス間共有メモリをゼロで初期化
::WriteProcessMemory(&pm, 0, &tbb, sizeof(TBBUTTON));
//他プロセスのツールボタンメッセージ→プロセス間共有メモリ
::SendMessage(hWndToolBar, TB_GETBUTTON, i, pm.lParam);
//プロセス間共有メモリ→受け皿
::ReadProcessMemory(&pm, 0, &tbb, sizeof(TBBUTTON));
//取りあえず表示
::printf("[ボタン番号 : %d][ボタン状態 : %d][ボタンスタイル : %d][ボタンID : %d][ビットマップ番号 : %d]\n", i, tbb.fsState, tbb.fsStyle, tbb.idCommand, tbb.iBitmap);
}
::CloseProcessMemory(&pm);
return 0;
}
お礼
具体的な例ありがとうございます。 とても参考になります。 >ツールボタンのどの情報を取りたいのでしょうか。 やりたいことはそれぞれのボタンを押すことです。 その為のツールバー上のボタンのハンドル?をどのようにとればよいかわかりませんでした。 なかなか難しい内容で時間がかかるかもしれませんが いただいた情報を頼りになんとか確認してみたいと思います。