C++ 中如何使用API函数 生成一个窗体?

C++ 中如何使用API函数 生成一个窗体?,第1张

生产窗体可以使用CreateWindowEx函数

函数功能:该函数创建一个具有扩展风格的层叠式窗口、d出式窗口或子窗口,其他与CreateWindow函数相同。

函数原型:

CreateWindowEx函数创建一个层叠的,自动d出的(pop-up)或是一个子窗口通过扩展格式。另外这个函数的作用与CreateWindow函数的作用相同。要获得更多的关于创建窗口的信息和关于CreateWindowEx函数参数的详细描述。参见CreateWindow

HWND CreateWindowEx(

DWOR DdwExStyle,        //窗口的扩展风格

LPCTSTR lpClassName,    //指向注册类名的指针

LPCTSTR lpWindowName,   //指向窗口名称的指针

DWORD dwStyle,          //窗口风格

int x,                  //窗口的水平位置

int y,                  //窗口的垂直位置

int nWidth,             //窗口的宽度

int nHeight,            //窗口的高度

HWND hWndParent,        //父窗口或蚂的句柄

HMENU hMenu,            //菜单的句柄或是子窗口的标识符

HINSTANCE hInstance,    //应用程序实例的句柄

LPVOID lpParam          //指向窗口的创建数据

)

例程:

include<windows.h>

#include<stdio.h>

LRESULT CALLBACK WinDouProc(

    HWND hwnd,      // handle to window

    UINT uMsg,      // message identifier

    WPARAM wParam,  // first message parameter

    LPARAM lParam   // second message parameter

)

class CWnd

{

public:

     CWnd()

     带团闷{

          m_hWnd = NULL

     }

     BOOL CreateEx(

          DWORD dwExStyle,      // extended window style

          LPCTSTR lpClassName,  // pointer to registered class name

          LPCTSTR lpWindowName, // pointer to window name

          DWORD dwStyle,        // window style

          int x,                // horizontal position of window

          int y,                // vertical position of window

          int nWidth,           // window width

          int nHeight,          // window height

          HWND hWndParent,      // handle to parent or owner window

         HMENU hMenu,          // handle to menu or child-window identifier

         HANDLE hInstance,     // handle to application instance

         LPVOID lpParam        // pointer to window-creation data

     )

     BOOL ShowWindow( int nCmdShow )

     BOOL UpdateWindow()

public:

     HWND m_hWnd

}

BOOL CWnd::CreateEx(

      DWORD dwExStyle,      // extended window style

      LPCTSTR lpClassName,  // pointer to registered class name

      LPCTSTR lpWindowName, // pointer to window name

      DWORD dwStyle,        // window style

      int x,                // horizontal position of window

      int y,                // vertical position of window

      int nWidth,           // window width

      int nHeight,          // window height

      HWND hWndParent,      // 蠢弯handle to parent or owner window

      HMENU hMenu,          // handle to menu or child-window identifier

      HANDLE hInstance,     // handle to application instance

      LPVOID lpParam        // pointer to window-creation data

)

{

     m_hWnd = ::CreateWindowEx  (dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,(HINSTANCE)hInstance,lpParam)

     if(m_hWnd != NULL)

          return TRUE

     else

         return FALSE

}

BOOL CWnd::ShowWindow(int nCmdShow)

{

     return ::ShowWindow(m_hWnd,nCmdShow)

}

BOOL CWnd::UpdateWindow()

{

     return ::UpdateWindow(m_hWnd)

}

int WINAPI WinMain(

  HINSTANCE hInstance,  // handle to current instance

  HINSTANCE hPrevInstance,  // handle to previous instance

  LPSTR lpCmdLine,      // pointer to command line

  int nCmdShow          // show state of window

)

{

    WNDCLASS wndclass     //先设计窗口类

    wndclass.cbClsExtra = 0

    wndclass.cbWndExtra = 0

    wndclass.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH)

    wndclass.hCursor = LoadCursor(NULL,IDC_HELP)

    wndclass.hIcon = LoadIcon(NULL,IDI_WARNING)

    wndclass.hInstance = hInstance

    wndclass.lpfnWndProc = WinDouProc

    wndclass.lpszClassName = "Magic_Maggie"

    wndclass.lpszMenuName = 0

    wndclass.style = CS_VREDRAW | CS_HREDRAW

     //某一个变量原油几个变量去掉一个特征,可以用取反(~)后再进行与(&)

     //例如:style上去掉CS_NOCLOSE,可以style&~CS_NOCLOSE

    RegisterClass(&wndclass)     ///注意先建立再注册昂

    CWnd wnd

     wnd.CreateEx(NULL,"Magic_Maggie","DouDou",WS_OVERLAPPEDWINDOW,0,0,800,600,NULL,NULL,hInstance,NULL)

     wnd.ShowWindow(SW_SHOWNORMAL)

     wnd.UpdateWindow()

     MSG msg     //消息循环

     while(GetMessage(&msg,NULL,0,0))

    {

           TranslateMessage(&msg)

           DispatchMessage(&msg)   //触发WinDouProc

     }

    return 0

}

 

 

LRESULT CALLBACK WinDouProc(

    HWND hwnd,      // handle to window

     UINT uMsg,      // message identifier

    WPARAM wParam,  // first message parameter

    LPARAM lParam   // second message parameter

)

{

 switch(uMsg)

 {

 case WM_LBUTTONDOWN:

      MessageBox(hwnd,"您按下了鼠标左键昂","豆豆的程序",MB_OK)

      HDC hdc

      hdc = GetDC(hwnd)    

     //The GetDC function retrieves a handle to a display device context for the client area of a specified window or for the entire screen. You can use the returned handle in subsequent GDI functions to draw in the device context.

      TextOut(hdc,0,0,"感谢您对豆豆程序的支持昂",strlen("感谢您对豆豆程序的支持昂"))

      ReleaseDC(hwnd,hdc)

      break

 

case WM_CHAR:

      char szChar[20]

      sprintf(szChar,"Char is %d",wParam)

      MessageBox(hwnd,szChar,"豆豆的程序",MB_OK)

      break

 

case WM_PAINT:

      PAINTSTRUCT ps

      HDC hDc

      hDc = BeginPaint(hwnd,&ps)

      TextOut(hDc,0,0,"这个是重绘滴哦",strlen("这个是重绘滴哦"))

      EndPaint(hwnd,&ps)

      break

 

case WM_CLOSE:   //这个case与下边的destroy这个case不要弄错了,否则窗口不出现,但任务管理器中运行

      if(IDYES == MessageBox(hwnd,"您真的要退出么?","豆豆的程序",MB_YESNO))

      {

           DestroyWindow(hwnd)

      }

      break

 

case WM_DESTROY:

      PostQuitMessage(0)

      //////////////////////////////////////////?????????????????????

      break

 

default:

     return DefWindowProc(hwnd,uMsg,wParam,lParam)  // 别忘记了return

 

  }

 return 0

}

步骤:

1、注册窗口类;

2、创建窗体;

3、消息循环;

4、编写窗口消息处理函数。

代码:

#include <windows.h>

#include<tchar.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

int WINAPI _tWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR szCmdLine, int nCmdShow)

{

    WNDCLASS wc

    wc.style = CS_HREDRAW | CS_VREDRAW

    wc.lpfnWndProc = WindowProc

    wc.cbClsExtra = 0

    wc.cbWndExtra = 0

    wc.hInstance = hInstance

    wc.hIcon = NULL

    wc.hCursor = LoadCursor(NULL,IDC_ARROW)

    wc.hbrBackground = (HBRUSH)COLOR_WINDOW//(HBRUSH)GetStockObject()

    wc.lpszMenuName = NULL

    wc.lpszClassName = _T("MyWindowClass")

    if (!RegisterClass(&wc))

    {

        MessageBox (NULL, _T("无法注册窗口类"), _T("错误"), MB_OK)

        return 0 

    }

    HWND newWindow = CreateWindow(

 蠢乱链                                       _T("MyWindowClass"),

                                        _T("我的第一个winapi程序"),

                                        WS_OVERLAPPEDWINDOW,

                                        0,

                                        0,

                                        CW_USEDEFAULT,

                                        CW_USEDEFAULT,

                                        NULL,

                                        NULL,

                                        hInstance,

                                        NULL

                                    )

    if (NULL == newWindow)

    {

        MessageBox (NULL, _T("无法创建窗体"), _T("错误"), MB_OK)

        return 0

    }

    ShowWindow(newWindow, nCmdShow)

    UpdateWindow(newWindow)

    MSG msg

    while(GetMessage(&msg, NULL, 0, 0))

    {

        TranslateMessage(&msg)

        DispatchMessage(&msg)

    }

}

    LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

    {

        switch (uMsg)

        {

            case WM_DESTROY:

            {

                陪雹PostQuitMessage(0)

                break

            }

            default :

                return DefWindowProc(hwnd, uMsg, wParam, lParam)

        }

        return 0

    }

就是一个只有标带孙题栏、关闭按钮、最小化按钮、最大化/还原按钮、显示区域的窗体。

我也是做到半路上卡住了,API方式是指定C能认识的控件ID的,比如Windows内部程序,其他的程序,不对,名称不能识别

 [DllImport("user32.dll", EntryPoint = "FindWindow")]

        public static extern int FindWindow(

        string lpClassName,

        string lpWindowName

        )

        [DllImport("user32.dll", EntryPoint = "FindWindowEx")]

        public static extern int FindWindowEx(

        int hWnd1,

        int hWnd2,

        string lpsz1,

        string lpsz2

        )

        [DllImport("user32.dll", EntryPoint = "SendMessage")]

        public static extern int SendMessage(

        int hwnd,

        int wMsg,

        int wParam,

        System.Text.StringBuilder lParam

 颤困或 尺野      )

        private void button1_Click(object sender, EventArgs e)

        {

            int hwnd = FindWindow("成品缴库扫描",null)                   

            hwnd = FindWindowEx(hwnd, 0, "TextBox","textBox1" )     //压根就不认识TextBox,就记事本可以认识         

            System.Text.StringBuilder str = new System.Text.StringBuilder(255)            茄伍  

            SendMessage(hwnd, 0xD, str.Capacity, str)                

            MessageBox.Show(str.ToString())           

        }

这是CSDN上一个朋友给的方法,我也是纠结怎么去,找任意软件的文本


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12311886.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存