الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفيه تعديل هذا الكود للحصول على عنوان النافذه من خلال ال اسم البروسس الخاص بها

بدأه Mohamed El Sayed في 16 نوفمبر 2014 · 2 رد · 777 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سألت فى موضوع سابق عن التأكد ما اذا كان برنامج معين يعمل ام لا و اخى Mr B لم يقصر ف الاجابه لكن الان هل يمكن تعديل الكود الذى اعطاه لى او كتابه غيره للتحصول على عنوان النافذه من خلال ال process name لها

 

مثال للتوضيح

مدخلات البرنامج : notepad.exe

المخرجات : New Text Document - Notepad ( بفرض ان هناك ملف نصى بهذا الاسم مفتوح بواسطه ال نوت باد )

 

كود Mr B

#define UNICODE
#include <Windows.h>
#include <TlHelp32.h>
#include <stdio.h>

int
main(void)
{
HANDLE Snapshot;

Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if(Snapshot != INVALID_HANDLE_VALUE) {
PROCESSENTRY32 ProcessEntry;
BOOL Succeed;

ProcessEntry.dwSize = sizeof(PROCESSENTRY32);

Succeed = Process32First(Snapshot, &ProcessEntry);

while(Succeed) {
if(lstrcmp(ProcessEntry.szExeFile, L"notepad.exe") == 0) {
printf("notepad.exe found, id %ld\n", ProcessEntry.th32ProcessID);
}
Succeed = Process32Next(Snapshot, &ProcessEntry);
}

CloseHandle(Snapshot);
}

return 0;
}

ملحوظه : السؤال لغرض تعليمى لا للاستخدام فى عمل برنامج ,, بمعنى انى لم اخالف قوانين المنتدى 

#2

العملية قد تكون فيها أكثر من نافذة، أي أكثر من thread في كل واحد نافذة، لايشترط أن تكون مرئية!.

 

يمكنك عرض قائمة بالنوافذ باستخدام EnumWindows، ستحصل على مقبض للنافذة، استخرج معرف العملية التي تتبع له باستخدام GetWindowThreadProcessId، وقارنه بالعملية التي تريد، يمكنك الحصول على اسم النافذة وقتها باستخدام GetWindowText.

#define UNICODE
#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>

#include <io.h>      /* _setmode, _fileno */
#include <fcntl.h>   /* _O_U16TEXT */

static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);

int
main(void)
{
  DWORD ProcessId = 4176; /* العملية التي تريدها */

  /* wprintf للتأكد من ظهور النصوص العربية مع */
  _setmode(_fileno(stdout), _O_U16TEXT);

  EnumWindows(EnumWindowsProc, (LPARAM)&ProcessId);

  return 0;
}

static BOOL CALLBACK
EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
  DWORD TargetProcessId = *(const DWORD *)lParam;
  DWORD CurrentProcessId;

  GetWindowThreadProcessId(hwnd, &CurrentProcessId);

  if(CurrentProcessId == TargetProcessId) {
    int TextLength = GetWindowTextLength(hwnd);
    TCHAR *Text;

    if(TextLength) {
      Text = (TCHAR *) malloc(TextLength * sizeof(TCHAR) + sizeof(TCHAR));
      if(Text != NULL) {
        GetWindowText(hwnd, Text, TextLength + 1);
        wprintf(L"%ls\n", Text);
        free(Text);
      }
    }
  }

  return TRUE;
}

المثال مبني باستخدام msvc.

تم تعديل هذه المشاركة بواسطة Mr.B في 22 نوفمبر 2014 في 16:29

#3

الكود لا يطبع عنوان النافذه ,, فقط يطبع بعض الاحرف !

تم تعديل هذه المشاركة بواسطة Mohamed El Sayed في 21 نوفمبر 2014 في 23:04

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…