الوصول إلى أيقونات شريط المهام النوافذ في C ++

StackOverflow https://stackoverflow.com/questions/1169258

  •  19-09-2019
  •  | 
  •  

سؤال

أنا أبحث عن وسيلة للحصول على أيقونات شريط المهام الحالية برمجيا (وليس علبة النظام) لكل برنامج موجود في شريط المهام.

لم يكن لدي حظ كبير مع MSDN أو Google، لأن كل النتائج تتعلق علبة النظام.

أي اقتراحات أو مؤشرات سيكون مفيدا.

تحرير: لقد حاولت فكرة Keegan Hernandez لكنني أعتقد أنني قد فعلت شيئا خطأ. الرمز أدناه (C ++).

#include <iostream>
#include <vector>
#include <windows.h>
#include <sstream>
using namespace std;
vector<string> xxx;
bool EnumWindowsProc(HWND hwnd,int ll)
{
    if(ll=0)
    {
        //...
        if(IsWindowVisible(hwnd)==true){
        char tyty[129];
        GetWindowText(hwnd,tyty,128);
        stringstream lmlm;
        lmlm<<tyty;
        xxx.push_back(lmlm.str());
        return TRUE;
        }
    }
}
int main()
{
    EnumWindows((WNDENUMPROC)EnumWindowsProc,0);
    vector<string>::iterator it;
    for(it=xxx.begin();it<xxx.end();it++)
    {cout<< *it <<endl;}
    bool empty;
    cin>>empty;
}
هل كانت مفيدة؟

المحلول

هناك العديد من المشاكل مع الكود الخاص بك، يرجى الاطلاع على تصحيحاتي. قم بتشغيل التحذيرات (أو اقرأ إخراج الإنشاء) على برنامج التحويل البرمجي الخاص بك، كان يجب حذره (أو تحذر) عن هذه الأشياء!

#include <iostream>
#include <vector>
#include <windows.h>
#include <sstream>
using namespace std;
vector<string> xxx;
// The CALLBACK part is important; it specifies the calling convention.
// If you get this wrong, the compiler will generate the wrong code and your
// program will crash.
// Better yet, use BOOL and LPARAM instead of bool and int.  Then you won't
// have to use a cast when calling EnumWindows.
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM ll)
{
    if(ll==0) // I think you meant '=='
    {
        //...
        if(IsWindowVisible(hwnd)==true){
        char tyty[129];
        GetWindowText(hwnd,tyty,128);
        stringstream lmlm;
        lmlm<<tyty;
        xxx.push_back(lmlm.str());
        //return TRUE; What if either if statement fails?  You haven't returned a value!
        }
    }
    return TRUE;
}
int main()
{
    EnumWindows(EnumWindowsProc,0);
    vector<string>::iterator it;
    for(it=xxx.begin();it<xxx.end();it++)
    {cout<< *it <<endl;}
    bool empty;
    cin>>empty;
}

نصائح أخرى

نأمل أن هذا يكفي لتحمل عليك:

يحتوي Winapi على وظيفة Enumwindows التي ستدعو وظيفة رد الاتصال لكل HWND محفورا حاليا. لاستخدامه يكتب رد اتصال النموذج:

Bool Callback EnumwindowsProc (HWND HWND، LPARAM LPARAM)؛

ثم اتصل بالمعطف (EnumwindowsProc، LPARAM) بحيث سيتصل API بإعاشك لكل نافذة، حيث يمثل HWND نافذة واحدة محددة.

لتحديد ما إذا كانت كل نافذة مرئية، وبالتالي على شريط المهام، يمكنك استخدام الوظيفة ISWindowVisible (HWND) على كل HWND يتلقى رد الاتصال. إذا كنت محظوظا، يمكنك الحصول على أي معلومات أخرى تحتاجها من HWNDs مرت إلى هذا الاتصال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top