Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
 Аватар для semiono
161 / 18 / 0
Регистрация: 14.09.2010
Сообщений: 472
Записей в блоге: 6
FASM

FindWindow, ShowWindow, etc.

24.09.2010, 00:45. Показов 3295. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Assembler
1
2
3
        invoke ShellExecute,NULL,NULL,lpFile,NULL,NULL,NULL
        invoke FindWindow,'ParagonEngineClass','Paragon Partition Manager'
        invoke ShowWindow,eax,SW_MAXIMIZE
Нужно повлиять на окно, как это правильно делать? Может здесь нужно EnumWindows или что-то ещё?
Или задержки добавить - invoke sleep,500 ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.09.2010, 00:45
Ответы с готовыми решениями:

Связка FindWindow+ShowWindow
Есть код: HWND handle = FindWindow(...) //находим нужный хэндл //далее проверка на сущность описателя ShowWindow(handle,...

Функция ShowWindow работает неверно
делаю фичу: чтобы нельзя было запустить копию программы, если запускается, то закрыть и найти, показать первую программу. В самой проге, на...

Некорректно выполняется API ShowWindow
Здравствуйте. Делаю программу, которая в перспективе должна будет проверять объявления в интернете, и если найдет удовлетворяющие поиску...

3
1080 / 1007 / 107
Регистрация: 28.02.2010
Сообщений: 2,889
24.09.2010, 05:04
Цитата Сообщение от semiono Посмотреть сообщение
повлиять на окно
Как понять?

Добавлено через 7 минут
Все. Понял. Есть вариант написанный на VB:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Public Const SEE_MASK_NOCLOSEPROCESS = &H40
Public Const SEE_MASK_INVOKEIDLIST = &HC
Public Const SEE_MASK_FLAG_NO_UI = &H400
 
Public Const INFINITE = &HFFFF      'Infinite Wait Time
Public Const SW_NORMAL = 1
 
 
Public Type SHELLEXECUTEINFO
        cbSize As Long
        fMask As Long
        hwnd As Long
        lpVerb As String
        lpFile As String
        lpParameters As String
        lpDirectory As String
        nShow As Long
        hInstApp As Long
        '  Optional Fields
        lpIDList As Long
        lpClass As String
        hkeyClass As Long
        dwHotKey As Long
        hIcon As Long
        hProcess As Long
End Type
 
 
Public Declare Function ShellExecuteEx Lib "shell32.dll" (SEI As SHELLEXECUTEINFO) As Long
Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
 
 
Public Sub ExecAndWait(ByVal hwnd As Long, ByVal ProgramPath As String)
 
Dim SEI As SHELLEXECUTEINFO
 
'Filling SEI structure
With SEI
    .cbSize = Len(SEI)     'Bytes of the structure
    .fMask = SEE_MASK_NOCLOSEPROCESS     'I need hProcess to be retrieved
    .lpFile = ProgramPath 'Program Path
    .lpVerb = "Open"   'Action to do
    .nShow = SW_NORMAL    'How the program will be showed
    .lpDirectory = Left(ProgramPath, (InStrRev(ProgramPath, "\")) - 1)
    .hwnd = hwnd   'Window Handle
 
End With
 
ShellExecuteEx SEI         'Execute the program hProcess recives the Process Handle used next.
 
WaitForSingleObject SEI.hProcess, INFINITE     'Here wait until close the program
 
CloseHandle hProcess
 
End Sub
1
 Аватар для semiono
161 / 18 / 0
Регистрация: 14.09.2010
Сообщений: 472
Записей в блоге: 6
24.09.2010, 22:41  [ТС]
Вот ещё проще
Assembler
1
2
3
4
5
; AutoIt3 Script
Run(@ProgramFilesDir& "\Partman\bin\pm.exe")
Sleep("300")
; WinSetState("Paragon Partition Manager", "[Class:ParagonEngineClass]", @SW_RESTORE)
Send("{ALT+SHIFT}") ; так как предыдущая функция почему-то тоже не работает, я юзаю Send()
Однако, на ассемблере насколько я понимаю, мне нужно поймать хендл.
Либо функция FindWindow() этого не делает, либо я где-то что-то криво делаю.

Задача в том чтобы установить окно программы в нормальное положение...
Так как приложение открывается всегда на втором плане, например под окном explorer итп.
Я в первом посте специально для теста указал флаг SW_MAXIMIZE чтобы проверить работу функции,
вообщем-то нужен SW_NORMAL, но похоже что ничего не работает.

Просто запустить прогу как ShellExecute(...bin\pm.exe c флагом @SW_NORMAL) ничего не даёт,
так как это какой-то внтренний баг или особенность. Впрочем такое иногда встречается, но
сейчас это не важно, так как я думаю лучше установить режим окна уже после открытия.
---

Вообще интересует, как в общем случае отлавливать окна? Какой апи ловить хендл?
Как скажем нажать кнопку в MessageBox чужого приложения?

---
Евгений М., это у тебя там ShellExecuteEx() !? Я над этой функцией бился неделю, теперь решил
отдохнуть от неё Слишком запутанно там со структурами для меня, хотя апи именно то-что надо!

PS до меня msdn туго доходит =)
0
 Аватар для semiono
161 / 18 / 0
Регистрация: 14.09.2010
Сообщений: 472
Записей в блоге: 6
26.09.2010, 03:38  [ТС]
Я решил эту задачу! Так как я начинающий меня это радует )))
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
include '%fasm%\win32ax.inc'
section '.code' executable
start: ; сначала идёт просто установка размеров экрана для приложения через реестр :)
 
        invoke RegCreateKeyEx,HKLM,\
        'Software\Paragon Software\Partition Manager\English\Options',NULL,NULL,REGN,KEY_WRITE,NULL,phkResult,NULL
        invoke RegSetValueEx,[phkResult],'WinRect_t',NULL,REG_DWORD,@00000000,4
        invoke RegSetValueEx,[phkResult],'WinRect_b',NULL,REG_DWORD,@0000032c,4
        ; хотя надо будет переделать > invoke GetSystemMetrics,SM_CXSCREEN я просто забыл об этом.
        invoke RegCloseKey,[phkResult]
 
        invoke ExpandEnvironmentStrings,'%ProgramFiles%\Partman\bin\pm.exe',lpFile,MAX_PATH
        invoke ShellExecute,NULL,NULL,lpFile,NULL,NULL,NULL
 
        mov eax,5
@@:
        invoke FindWindow,class,NULL
        test eax,eax
        jnz @f
        dec ebx
        jz exit
        invoke Sleep,500
        jmp @r
@@:
;       invoke ShowWindow,eax,SW_SHOWNORMAL ; это не верный был путь!
        invoke SetForegroundWindow,eax ; как я это сразу не знал! )
exit:
        invoke ExitProcess,NULL
 
.end start
 
section '.data' readable writable
        HKLM = HKEY_LOCAL_MACHINE
        REGN = REG_OPTION_NON_VOLATILE
 
        @00000000 dd 0x00000000
        @0000032c dd 0x0000032c
 
        class db 'ParagonEngineClass',0
        phkResult dd ?
        lpFile db ?,0 ; подскажите эту строку я правильно пишу или есть лучше вариант?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.09.2010, 03:38
Помогаю со студенческими работами здесь

Есть ли аналог winapi функции showWindow в Linux?
Есть ли аналог winapi функции showWindow в Linux? Заранее спасибо.

ShowWindow из не главного потока приводит к ожиданию неизвестного
Перерабатываю свою небольшую программу, из-за проблем с тем что создание нового окна в потоке занимало много времени я решил поступить...

ShowWindow не получается восстановить видимость окна после скрытия
Поиск дал несколько точно таких же тем на форуме, но ни в одной из них ответа так и не было. Скрываю блокнот ShowWindow(hWnd, 0)...

Какие значения может принимать второй параметр функции ShowWindow?
Какие значения может принимать второй параметр функции ShowWindow?

FindWindow
господа если я при помощи FindWindow нахожу окно с простым названием , то всё нормально,а как быть если я напишу вот так - ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru