ウィンドウハンドルやその他の情報を取得するウィジェットをC言語で書く方法.

11644 ワード

ブロガーはSDKプログラミングの初心者で、常に技術を学んでタスク駆動の観念を堅持し、Windowsプロセス、カーネルオブジェクト、プロセス管理と制御に関する知識を学んだ後、メモリモディファイヤを設計して手を練習したいと思っていましたが、現在実行されている各ウィンドウのハンドルを取得するステップが詰まって、調査と研究を経て、ついに以下のCUIウィジェットを書き出し,ウィンドウおよびサブウィンドウハンドルの取得,ClassNameの取得,WindowTextの取得の問題を解決した.このウィジェットがSPY++の一部の機能に代わるかどうかはわかりませんが・・・
//UI:GUI(Graphical User Interface)グラフィックユーザインタフェースに対するCommand User Interfaceコマンドラインユーザインタフェース.
PS:ブロガーは勉強が浅いので、プログラムに間違いがあれば、皆さんのご指摘を歓迎します.
このプログラムは、次の4つのAPIに基づいてEnumWindows()を実装する.
EnumWindows()
//BOOL EnumWindows(WNDENUMPROC,LPARAM)
//WNDENUMPROC         
//LPARAM         ,         .

EnumChildWindows()
    : 

  BOOL EnumChildWindows(HWND hWndParent,WNDENUMPROC lpEnumFunc, LPARAM lParam);
  //HWND hWndParent       
  //WNDENUMPROC lpEnumFunc         
  //LPARAM lParam        
  //  :               API     。        true,           ;    false,       。 

GetClassName()
GetClassName(hwnd,classname,256);
//GetClassName();hwnd        /classname      LPTSTR   ,      /256 int,  classname   ,    .
//                        ,      ,    0.

GetWindowText()
// GetClassName      ,    。

//それらのパラメータリストと解釈は以下のコードコメントに反映されますので、以上の4つの関数の使い方を知りたければ参考にしてもいいです.
基本的な考え方は簡単で、まずEnumWindowsを呼び出し、すべての親フォームを遍歴し、遍歴時にEnumChildWindowsを呼び出し、各親フォームの下でサブフォームを遍歴し、あれば出力します.
以下はソースコードです.
/*
    :   Windows     
    :             classname,windowtext,hwnd(    ).
    : CUI WIN32     
  :           
    : [email protected] 
  :              WindowsXP x86 Dev-C++ 5.4.2
                         Windows10 x64 Dev-C++ 5.9.2 
             64    32        ,        . 
*/

#define Primary false //         //            (true)          
                      //        ,             ,        WindowText   。 

#include
#include
#include 
//EnumWindows() EnumChildWindows()      .
//  EnumChildWindows()     enumchildwindows_callback(),   enumwindows_callback()     .
BOOL CALLBACK enumchildwindows_callback(HWND hwnd, LPARAM lParam)
//                enumwindows_callback()!
//  enumwindows_callback()        ,            ,       .
//          ,        enumwindows_callback(); 
{
    TCHAR classname[256];
    TCHAR windowtext[256];
    int cn = GetClassName(hwnd,classname,256);
    int wt = GetWindowText(hwnd,windowtext,256);
    if(cn==0)
    {
        if(wt==0)
        {
            printf("    Error in EnumChildWindows_CALLBACK
"
); return FALSE; } else if(wt!=0) { printf(" NULL ||| %18s ||| %d
"
,windowtext,hwnd); //%18s 18 ,printf 。 return TRUE; } } else if(cn!=0) { if(wt==0) { printf(" %-18s ||| NULL ||| %d
"
,classname,hwnd); //- , 。 return TRUE; } else if(wt!=0) { printf(" %-18s ||| %s ||| %d
"
,classname,windowtext,hwnd); return TRUE; } } } BOOL CALLBACK enumwindows_callback(HWND hwnd, LPARAM lParam) //hwnd ,lParam , (EnumWindows) , , 0; { TCHAR classname[256];// ! LPTSTR , malloc , . TCHAR windowtext[256]; int cn = GetClassName(hwnd,classname,256); //GetClassName();hwnd /classname LPTSTR , /256 int, classname , . // , , 0. int wt = GetWindowText(hwnd,windowtext,256); // GetClassName(); if(cn==0) { if(wt==0) { printf("Error in EnumWindows_CALLBACK
"
); return FALSE; // } else if(wt!=0) { printf("NULL ||| %18s ||| %d
"
,windowtext,hwnd); return TRUE; // ! } } else if(cn!=0) { if(wt==0) { if(Primary==true)return TRUE;// , , . else if(Primary==false) { printf("------------------------------------------------------------
"
);// . printf("%-18s ||| NULL ||| %d
"
,classname,hwnd); int check=EnumChildWindows(hwnd,(WNDENUMPROC)enumchildwindows_callback,0);// EnumChildWindows. if(check == 0) printf(" ->NoneChildWindow
"
);// . return TRUE; } } else if(wt!=0) { if(Primary==true) { printf("%-18s ||| %s ||| %d
"
,classname,windowtext,hwnd); return TRUE; } else if(Primary==false) { printf("------------------------------------------------------------
"
);// . printf("%-18s ||| %s ||| %d
"
,classname,windowtext,hwnd); int check=EnumChildWindows(hwnd,(WNDENUMPROC)enumchildwindows_callback,0); if(check == 0) printf(" ->NoneChildWindow
"
); return TRUE; } } } } int main() { // printf("WINDOWS_EXPLORER
"
); if(Primary==true)printf("PRIMARY_MODE

"
); else if(Primary==false)printf("ADVANCED_MODE

"
); printf("CLASSNAME----WINDOWTEXT----(int)HWND

"
); int check = EnumWindows((WNDENUMPROC)enumwindows_callback,0); //BOOL EnumWindows(WNDENUMPROC,LPARAM) //WNDENUMPROC //LPARAM , . if(check == 0)printf("Error in EnumWindows
"
); system("pause"); return 0; }

最後にこのソースコードのGithubアドレスを添付します
https://github.com/ZhangJunshuo/WindowsInformationExplorer.git