powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / поясните по исходнику
12 сообщений из 12, страница 1 из 1
поясните по исходнику
    #38776961
crause
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как то давно нашел утилиту по замене курсора при вводе вроде как полезная штука местами.
решил пару утилит аналогичных сделать, естественно на delphi.

Код: plaintext
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.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
#define OEMRESOURCE
#include <windows.h>

HINSTANCE	g_instance;
HHOOK		g_hook;
HCURSOR		g_hc_ibeam;
UINT_PTR	g_timer = NULL;
DWORD		g_active = 0;
DWORD		g_layout = 0;

void CALLBACK UpdateTimer(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
	if (g_active < GetTickCount())
	{
		KillTimer(0, g_timer);
		g_timer = NULL;
		g_active = 0;
		g_layout = 0;
		SetSystemCursor(CopyCursor(g_hc_ibeam), OCR_IBEAM);
	}
	else
	{
		int layout = (int) GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL)) & 0xFFFF;
		if (g_layout != layout)
		{
			g_layout = layout;
			HCURSOR hc_new = LoadCursor(g_instance, MAKEINTRESOURCE(layout));
			if (hc_new)
			{
				SetSystemCursor(hc_new, OCR_IBEAM);
			}
			else
			{
				SetSystemCursor(CopyCursor(g_hc_ibeam), OCR_IBEAM);
			}
		}
	}
}

LRESULT CALLBACK LowLevelKeyboardHook(int nCode, WPARAM wParam, LPARAM lParam)
{
	if (nCode == HC_ACTION)
	{
		KBDLLHOOKSTRUCT *ks = (KBDLLHOOKSTRUCT*)lParam;
		if (ks->vkCode==VK_LSHIFT)
		{
			if (wParam == WM_KEYDOWN)
			{
				g_active = GetTickCount() + 10000;
				UpdateTimer(NULL, NULL, NULL, NULL);
				g_timer = SetTimer(NULL, g_timer, 100, UpdateTimer);
			}
			else if (wParam == WM_KEYUP && g_active)
			{
				g_active = GetTickCount() + 1000;
			}
		}
	}
	return CallNextHookEx(g_hook, nCode, wParam, lParam);
}

int Main()
{
	HANDLE mutex = CreateMutex(NULL, FALSE, "LangCursor");
	if (GetLastError() == ERROR_ALREADY_EXISTS || GetLastError() == ERROR_ACCESS_DENIED) return 1;

	g_hc_ibeam = CopyCursor(LoadCursor(NULL, IDC_IBEAM));
	if (!g_hc_ibeam) return 1;

	g_instance = GetModuleHandle(NULL);
	g_hook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardHook, g_instance, 0);
	if (!g_hook) return 1;

	MSG msg;
	while (GetMessage(&msg,0,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	
	UnhookWindowsHookEx(g_hook);
	DestroyCursor(g_hc_ibeam);
	return 0;
}

EXTERN_C void WINAPI WinMainCRTStartup()
{
	ExitProcess(Main());





- Зачем автору в исходнике mutex?
- приложение не оконное зачем тут GetMessage.... в цикле?
...
Рейтинг: 0 / 0
поясните по исходнику
    #38776978
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crause
Код: sql
1.
2.
3.
4.
5.
HCURSOR hc_new = LoadCursor(g_instance, MAKEINTRESOURCE(layout));
if (hc_new)
{
   SetSystemCursor(hc_new, OCR_IBEAM);
}


Ещё вопрос: что это за фигня, если в MSDN написано "The system destroys hcur by calling
the DestroyCursor function. Therefore, hcur cannot be a cursor loaded using the LoadCursor
function."?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
поясните по исходнику
    #38776986
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crause- Зачем автору в исходнике mutex?
Для зашиты от одновременного запуска нескольких копий. Первая копия создает именованный мутекс, вторая получает ошибку ERROR_ALREADY_EXISTS и завершается.
...
Рейтинг: 0 / 0
поясните по исходнику
    #38776990
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crause- приложение не оконное зачем тут GetMessage.... в цикле?

Отвечу сразу на второй вопрос -- GetMessage тут нужно именно потому, что приложение оконное.
Собственно, оконность приложения тем и определяется, что оно использует GetMessage.
...
Рейтинг: 0 / 0
поясните по исходнику
    #38776999
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crause
- Зачем автору в исходнике mutex?


Чтобы контролировать запуск приложения и гарантированно иметь только один экземпляр приложения.
Т.е. повторный запуск приложения запрещается, как только выявляется, что приложение уже запущено, оно тут же завершается.
Делается это с помощью мьютекса , но это могло бы быть сделано на основе любого другого глобального объекта ядра (kernel) или GDI, на тех же принципах.
...
Рейтинг: 0 / 0
поясните по исходнику
    #38777006
crause
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C C++ незнаком и сейчас читаю его очень тяжело, но хотя не страшен черт так как он кажется.
Спасибо разобрался в коде вопросов стало намного меньше.
...
Рейтинг: 0 / 0
поясните по исходнику
    #38777011
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crause- приложение не оконное зачем тут GetMessage.... в цикле?

Тут конкретно это нужно, чтобы работал таймер и
вызывалась функция
UpdateTimer
...
Рейтинг: 0 / 0
поясните по исходнику
    #38777015
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crause,

это очевидно не самый лучший в мире код Windows-приложения...
Можно встречный вопрос -- зачем эта хрень нужна и что она делает?
...
Рейтинг: 0 / 0
поясните по исходнику
    #38777018
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crauseC C++ незнаком и сейчас читаю его очень тяжело...
Тут от Си разве что фигурные скобки :) остальное это WinAPI. Оно и в дельфях практически так же будет выглядеть.
...
Рейтинг: 0 / 0
поясните по исходнику
    #38777028
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crauseC C++ незнаком и сейчас читаю его очень тяжело, но хотя не страшен черт так как он кажется.
Спасибо разобрался в коде вопросов стало намного меньше.

Этот код на чистом С, это не С++...
...
Рейтинг: 0 / 0
поясните по исходнику
    #38777050
crause
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
приложение висит и при переключении языка и изменении курсора на Input меняет курсор на свой курсор-Input c языковыми метками.

Для меня что С# что Си что С++ все на один вид, различий не вижу.

А что в этом коде не так? Почему он не самый лучший?
...
Рейтинг: 0 / 0
поясните по исходнику
    #38777291
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, например, потому что это оконное приложение, а используется точка входа от консольного.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / поясните по исходнику
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]