HWND wnd, cwnd;
wnd = FindWindow(NULL, "Калькулятор");//получаем хендл главного окна
cwnd = FindWindowEx(wnd, NULL, NULL, "4");// получаем хендл кнопки 4
SendMessage(cwnd, WM_LBUTTONDOWN, 0, 0);// далее жмем
SendMessage(cwnd, WM_LBUTTONUP, 0, 0);
Программное нажатие кнопки
Может кто-нибудь знает как нажать кнопку на чужом окне. Мне известны заголовки окна, кнопки, есть handle окна. Если есть, дайте пример, желательно на Borland C++ или на чём-нибудь похожем.
Код:
пример показывает как нажать кнопку "4" в "Калькуляторе". пробуй.
Либо можно послать сообщение SendMessage(cwnd,BM_CLICK,0,cwnd); что тоже самое...
Ну не будте мрачными и хмурыми, покажите пример, лучше на fasm сразу.
? (masm32 тоже пойдёт если другого не дано)
а вот конкретная задача куда надо нажать
rundll32.exe Shell32.dll,Control_RunDLL desk.cpl desk,@Themes /Action:OpenTheme /File:"%WinDir%\Resources\Themes\Luna.theme"
Может здесь ShellExecute тоже можно заменить на какую нибудь прямую API?
Вполне себе работает.А на асме переписать–раз плюнуть,надо только узнать,какие кнопки как звать,и всё
Я уже написал на асме с ошибками, и уже поправили мои ошибки, но я пока калькулятор нажимал. Небось с этим окном ещё болше повозиться придётся, так как CPL наверное более хитрое окно.
Код:
include '%fasm%\win32ax.inc'
start:
invoke ShellExecute,NULL,NULL,'desk.cpl',NULL,NULL,SW_SHOW
invoke Sleep,20
invoke FindWindow,"#32770",NULL
mov [hWnd],eax
invoke FindWindowEx,[hWnd],NULL,NULL,button
mov [cWnd],eax
invoke SendMessage,[cWnd],BM_CLICK,NULL,NULL
exit:
invoke ExitProcess,NULL
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',user32,'USER32.DLL'
include '%fasm%\api\kernel32.inc'
include '%fasm%\api\user32.inc'
cWnd dd ?
hWnd dd ?
button db '1', 0
start:
invoke ShellExecute,NULL,NULL,'desk.cpl',NULL,NULL,SW_SHOW
invoke Sleep,20
invoke FindWindow,"#32770",NULL
mov [hWnd],eax
invoke FindWindowEx,[hWnd],NULL,NULL,button
mov [cWnd],eax
invoke SendMessage,[cWnd],BM_CLICK,NULL,NULL
exit:
invoke ExitProcess,NULL
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',user32,'USER32.DLL'
include '%fasm%\api\kernel32.inc'
include '%fasm%\api\user32.inc'
cWnd dd ?
hWnd dd ?
button db '1', 0
Не работает!
desk.cpl не имеет внутри ресурса который можно открыть так
rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,-1
Как же реально тогда называется этот button? :(
Цитата:
invoke FindWindow,"#32770",NULL
Лучше так не делать. Это ищет первое диалоговое окно. А их может быть несколько. И не обязательно первое из них нужное. К тому же автор сказал, что знает handle окна.
Здесь кнопки button1, button3, button4
В ресурсах же их вообще нету.
Может быть и не в этом дело, но всё же непонятно на что нажать тут :)
Может вы ресурс не той закладки смотрите? У меня по указанной командне открывается на закладке выбора темы. Правда у меня Windows XP, а он ли у вас не знаю...
Однако, может это и не мешает нажать кнопку, просто надо догадаться как. Хоть бы на си кто нибудь попытался, я бы потом сам в асм перекодил, жаль что никому не охота.
У меня XP конечно! :)
h = FindWindow(NULL, "Свойства: Экран");
h1 = FindWindowEx(h, 0, NULL, "ОК");
SendMessage(h1, WM_LBUTTONDOWN, 0, 0);
SendMessage(h1, WM_LBUTTONUP, 0, 0);
BM_CLICK не всегда срабатывает, иногда может вызвать ошибку, которую очень трудно потом найти.
В помощь тебе программа: InqSoft Window Scanner