#include<iostream> #include<windows.h> BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lp){ TCHAR name[1024]; GetClassName(hwnd, name, 1024); if(lstrcmp(name, "Sticky_Notes_Note_Window") == 0){ HWND child; child = FindWindowEx(hwnd, NULL, "DirectUIHWND", NULL); if(!child) return TRUE; child = FindWindowEx(child, NULL, "CtrlNotifySink", NULL); if(!child) return TRUE; child = FindWindowEx(child, NULL, NULL, NULL); if(!child) return TRUE; TCHAR text[1024]; SendMessage(child, WM_GETTEXT, 1024, (LPARAM)text); std::cout << text << std::endl << std::endl; } return TRUE; } int main(){ EnumWindows(EnumWindowsProc, 0); return 0; }
Spy++を使って付箋を見たら、"Sticky_Notes_Note_Window" - "DirectUIHWND" - "CtrlNotifySink" - ""のクラス名の順に子になっていた。一番下に、目的のデータがあるということが分かった。
目的のデータがあるハンドルを取得して、よしデータを取得しようと思って、17行目に
GetWindowText(child, text, 1024);と書いたらtextには何も入っていなかった。MSDNをよく見たら、
他のアプリケーションのエディットコントロールのテキストをこの関数で取得することはできません。とあった。知らなかったorz.. 下にあった、
他のプロセス内のコントロールのテキストを取得するには、GetWindowText 関数を呼び出すのではなく、直接 WM_GETTEXT メッセージを送ります。の通りにしたら動いた。 やったね!
参考
MSDN GetWindowText