سؤال

أحاول استخدام التعليمات البرمجية التالية إلى الضغط على زر على التطبيق:

HWND ButtonHandle;
if( (wnd = FindWindow(0, "Do you want to save?")) )
{   
   ButtonHandle = FindWindowEx(wnd, 0, "SaveButton", "&Save");
   SendMessage(wnd, WM_COMMAND, MAKEWORD(GetDlgCtrlID(ButtonHandle), BN_CLICKED ), (LPARAM)ButtonHandle);

}

أنها لا تعمل.حاولت اجتياز مختلف مقابض MAKEWORD وتغيير WPARM و LPARAM ولكن لا شيء.

أي أفكار حول كيفية انقر على زر تطبيق آخر هو النافذة ؟

رمز تقدير.شكرا

تحرير:والسبب أنه لا يبدو أن العمل الأذونات.لقد أرسلت PostMessage() وكانت النتيجة خطأ مع GetLastError() = 5 (أو تم رفض الوصول).أي أفكار ؟

EDIT2 أنا لا أقصد أن يكون وقحا ولكن من فضلك من فضلك من فضلك, أنا بالفعل بحثت في المعهد بما في ذلك الحصول على تعيين المناطق الزر ومن ثم إرسال زر أسفل زر الحصول على معرف عنصر التحكم على فئة معرف زليون أكثر.السبب سألت السؤال هنا في المقام الأول هو أنني استنفدت بالفعل البحث على الإنترنت.إذا كنت تعرف الإجابة الرجاء نشر المدونة, لا توحي API أن تريني كيف API يحل المشكلة.ليس من الصعب.شكرا لك.

تحرير 3:السؤال وكانت الإجابة المختارة تلقائيا عند الانتهاء من فضله.يبقى السؤال دون إجابة.

هل كانت مفيدة؟

المحلول

  1. هل أنت متأكد من أن "SaveButton" اسم فئة غير صالحة ؟ لا يمكنك الحصول على زر التعامل ؟
  2. محاولة إرسال رسائل إلى ButtonHandle نافذة (مباشرة على زر).

تحديث: وأعتقد أن هذا يجب أن تعمل ،

SendMessage(ButtonHandle, BM_CLICK, 0, 0);

نصائح أخرى

SendMessage(btnHandle, WM_LBUTTONDOWN, 0, 0);
SendMessage(btnHandle, WM_LBUTTONUP, 0, 0);
SendMessage(btnHandle, WM_LBUTTONDOWN, 0, 0);
SendMessage(btnHandle, WM_LBUTTONUP, 0, 0);

عليك أن ترسل زر انقر مرتين.لست متأكدا لماذا (ربما أول انقر فقط ينشط النافذة من زر) ، ولكن أنا باستخدام هذا الرمز لفترة طويلة ودائما عملت بالنسبة لي.

ربما هذا يمكن أن تساعد:http://www.cplusplus.com/forum/beginner/8806/

انظر الحل التالي, كما يمكنك استخدام

SendMessage(ButtonHandle, WM_LBUTTONDOWN, 0, 0);
SendMessage(ButtonHandle, WM_LBUTTONUP, 0, 0);

أو

SendMessage(ButtonHandle, BM_CLICK, 0, 0);

HWND buttonHandle = 0;

BOOL CALLBACK GetButtonHandle(HWND handle, LPARAM)
{
 char label[100];
 int size = GetWindowTextA(handle,label,sizeof(label));
 if(strcmp(label,"&Save") == 0)
 {
  buttonHandle = handle;
  return false;
 }
 return true;
}
void main()
{
 HWND windowHandle = FindWindowA(NULL,"Do you want to Save?");
 if(windowHandle != 0)
 {
  BOOL ret = EnumChildWindows(windowHandle,GetButtonHandle,0);

  if(buttonHandle != 0)
  {
   LRESULT res = SendMessage(buttonHandle,BM_CLICK,0,0);
   //SendMessage(buttonHandle,WM_LBUTTONDOWN,0,0); 
   //SendMessage(buttonHandle,WM_LBUTTONUP,0,0);
  }

 }



}

ملاحظة:الحصول على متأكد من نافذة النص ، والنص زر (التحقق إذا كان هناك مساحة في نهاية عنوان النافذة)

تم رفض الوصول الأخطاء على SendMessage أو PostMessage لا معنى له إلا عملية إرسال الرسالة التوالي في أقل مستوى النزاهة من عملية الهدف.

هذا لا ينبغي أن يحدث إلا إذا العملية التي تمتلك الهدف نافذة يتم تشغيل "asAdministrator" أو خدمة.و من الصعب اللعنة على الخدمات لإنشاء النوافذ على سطح المكتب التفاعلي مع نظام التشغيل Windows 6 وما فوق.

يمكنك القيام ببعض القراءة عن مستويات السلامة هنا إذا كانت تنطبق حتى عن بعد إلى هذا الوضع.إنترنت إكسبلورر هو فقط تطبيق آخر 'يختار في سلامة الأمن نموذج بقصد خفض مستوى النزاهة من نفسها من أجل رمل نفسها على نحو أكثر فعالية.

إذا كان يمكنك رفع نافذة تحتوي على زر يمكنك ارسال الخام الماوس الحدث إلى موقع داخل حدود زر.

هناك نوعان من وظيفة إلى محاكاة الماوس الحدث SendInput و mouse_event.أوصي باستخدام mouse_event وظيفة.لرفع نافذة يمكنك استخدام ShowWindow.أنا لا أعرف كيفية الحصول على مقبض الزر, ولكن إذا كان لديك لها hWnd من السهل أن تجد المطلق الموقف باستخدام GetWindowRect وظيفة.حاول استخدام هذه, إذا واجهت أي مشاكل سوف نكون سعداء لتقديم المساعدة.

أو تحديد مخصص WM داخل التطبيق الخاص بك نافذة للتعامل مع حفظ الطلب. WM_CUSTOM أو WM_USER (لا تذكر) بداية من تعريف المستخدم نافذة الرسائل.

عندما أفعل هذه الأشياء يمكنني استخدام SendKeys.فمن VB العش و C# يوفر واجهة جميلة ولكن ل C/C++ عليك أن تفعل ذلك <هذه الطريقة>.ما هو لطيف مع ذلك هو أنه يمكنك كتابة النصوص و تشغيلها بدلا من الترميز الثابت في التعليمات البرمجية الخاصة بك.

مايكروسوفت تسعى الآن الوصول النشط (MSAA) واجهة المستخدم الأتمتة ، (تم إعادة تسمية عدة مرات على مر السنين) انظر

آسف ليس لدي أي رمز بسيط للحصول على انك بدأته.كما "SendMessage()" لا يبدو أن العمل بالنسبة لك, أنا لا أعرف من خيار آخر وبصرف النظر عن "أتمتة واجهة المستخدم"

وأنا على افتراض لديك تحقق مع Spy++ (مع تثبيت MsDev) أن لك رسالة يتم إرسالها إلى الزر الصحيح الخ – هذا الزر هو معيار ويندوز الأزرار.أول لحظة أن أقول استخدام "SendMessage()" أو "PostMessage()" ولكن بالنظر إلى أعداد إجابات حول "SendMessage()" وحقيقة أنه لا يعمل بالنسبة لك.أتوقع ما يجري في...

يمكنك استخدام sendkeys (كما tr3 قال) لإرسال نقرات الماوس ، والذي يختلف من استخدام SendMessage.بل هو أيضا أقل مباشرة وأكثر هاك العش ولكن مفيد الآلي (في VBS).

أيضا, مجرد تخمين ولكن المشكلة يمكن أن رسالتك معالجة كسر في مكان ما من قبل لا يدعو قاعدة الطبقة الأعضاء.على سبيل المثال:

void CMyClass::OnMessageY(CWnd *cwnd)
{
    CBaseClass::OnMessageY(cwnd);
    //... my code
}

إذا كنت متأكد من ButtonHandle صالحة مقبض يمكنك استخدام زوج WM_LBUTTONDOWN و WM_LBUTTONUP رسالة بدلا من BN_CLICKED

HWND ButtonHandle;
if( (wnd = FindWindow(0, "Do you want to save?")) )
{   
    SendMessage(ButtonHandle, WM_LBUTTONDOWN, MK_LBUTTON, 0);
    SendMessage(ButtonHandle, WM_LBUTTONUP, MK_LBUTTON, 0);
}

غير ج النهج:استخدام جافا و جافا.awt.الروبوت فئة تحريك الماوس حول أداء العقارات النقرات (أعتقد أن هناك شيء في العالم ويندوز لهذا أيضا).المشكلة:عليك أن تعرف أين زر :D

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