WINAPI EnumWindowsProc:非标准语法; 使用&为成员创建一个点

1 c++ windows winapi

当我调用EnumWindows(EnumWindowsProc,0)时,我一直收到错误; 它将我的BOOL CALLBACK selectionWindows :: EnumWindowsProc(HWND hWnd,long lParam)函数转换为参数.

我知道它与类和selectionWindows有关 - 但我无法弄清楚我的生活.

这是.h

#ifndef SELECTIONWINDOWS_H
#define SELECTIONWINDOWS_H

#include <windows.h>
#include "mainwindow.h"

#include <QWidget>
#include <iostream>

class selectionWindows : public QWidget
{
    Q_OBJECT

public:

    selectionWindows(MainWindow * w);
    void selectionWindows::addWindows();
    BOOL CALLBACK EnumWindowsProc(HWND hWnd, long lparam);

    ~selectionWindows();

private:
        char buff[255];
    };
Run Code Online (Sandbox Code Playgroud)

以及我遇到困难的部分的切口:

BOOL CALLBACK selectionWindows::EnumWindowsProc(HWND hWnd, long lParam) {

    if (IsWindowVisible(hWnd))
        GetWindowTextW(hWnd, (LPWSTR) buff, 254);
    return true;

}    

void selectionWindows::addWindows() {

       EnumWindows(EnumWindowsProc, 0); //Here is the error

        for (int i = 0; i  != 254; ++i) {
            qDebug() << buff[i];
        }
    }
Run Code Online (Sandbox Code Playgroud)

我已经包含了windows.h和iostream

谢谢您的帮助!

IIn*_*ble 6

EnumWindows期望一个自由函数或静态类成员作为WindowsEnumProc.您无法传递非静态类成员.如果需要从WindowsEnumProc中访问类实例,请在调用中传递指向它的指针EnumWindows.该lParam的

要传递给回调函数的应用程序定义的值.

这是一个示例实现:

class selectionWindows : public QWidget {
    Q_OBJECT
public:
    selectionWindows(MainWindow * w);
    void selectionWindows::addWindows();
    BOOL CALLBACK EnumWindowsProc(HWND hWnd);
    static BOOL CALLBACK EnumWindowsProcStatic(HWND hWnd, LPARAM lParam);

    ~selectionWindows();
private:
    char buff[255];
};
Run Code Online (Sandbox Code Playgroud)

以下代码将实例指针传递给EnumWindowsAPI:

void selectionWindows::addWindows() {
    EnumWindows(selectionWindows::EnumWindowsProcStatic, reinterpret_cast<LPARAM>(this));
    // ...
}
Run Code Online (Sandbox Code Playgroud)

EnumWindowsProcStatic调用的类实例转发:

BOOL CALLBACK selectionWindows::EnumWindowsProcStatic(HWND hWnd, LPARAM lParam) {
    selectionWindows* p = reinterpret_cast<selectionWindows*>(lParam);
    return p->EnumWindowsProc(hWnd);
}
Run Code Online (Sandbox Code Playgroud)