|
please explain more !
what do you expect to have, what happens ?
TOXCCT >>> GEII power
|
|
|
|
|
I would think you'd need to create a keyboard hook using SetWindowsHook[Ex]() . When VK_RSHIFT is detected, replace it with VK_RETURN . As I've never tried this, it's only a guess.
"The pointy end goes in the other man." - Antonio Banderas (Zorro, 1998)
|
|
|
|
|
I have been trying to send an event from a DLL (Dynamically loaded) to a GUI application to display text.
I use shared memory for the transfer of data, also in this shared data area in the handle for this event.
In the DLL I
m_pMsg->hGlobalWriteEvent = CreateEvent(NULL, // no security attributes
FALSE, // manual-reset event
FALSE, // initial state is signaled
"CSLDisplayData" // object name
);
Note m_pMsg is a pointer to the shared memory area.
Then I send the event:-
// Signal GUI to process this request
::SetEvent(m_pMsg->hGlobalWriteEvent);
Now in the GUI I have a thread waiting on this event.
if (::WaitForSingleObject(ThreadData->m_pMsg->hGlobalWriteEvent, INFINITE) == WAIT_OBJECT_0)
{
etc
But this event in the GUI is never fired.
Note I can create and send an event to the thread from the GUI but not from the DLL.
What can I do?
|
|
|
|
|
You do not have to use shared memory in this case.
Just create an event in the GUI and in the DLL and use the same name for both CreateEvent calls. That should do the trick.
Jens
|
|
|
|
|
I have tried that and the only way the events will work if the GUI creates and sets the event.
I cant get working the DLL to create and set an event that the GUI will receive.
Nothing happens?
I thought it was the name that was importance, but decided to use the same handle and that does not work either!!!
|
|
|
|
|
You can't keep an event handle in shared memory. Handles are process-specific numbers and can only be shared between processes with inheritance or DuplicateHandle() .
Each process should call CreateEvent() with the same name. Your parameters also look backwards, it should be auto-reset and initially not signaled.
--Mike--
Personal stuff:: Ericahist | Homepage
Shareware stuff:: 1ClickPicGrabber | RightClick-Encrypt
CP stuff:: CP SearchBar v2.0.2 | C++ Forum FAQ
----
You cannot stop me with paramecium alone!
|
|
|
|
|
Ok thanks. Now working when CreateEvent call at both ends.
|
|
|
|
|
I have created a list control with 7 columns and need the user to be able to adjust the width of the columns. This all works fine unless the user adjusts a column width so that a scroll bar is needed. When this is done part of the window refuses to redraw automatically leaving grey patches in place of the data. Running RedrawWindow() (from a button) corrects the problem however I cannot find a message that is always sent when the user completes adjusting a column to run RedrawWindow() automatically. I have tried HDN_ENDTRACK and LVN_COLUMNCLICK plus a couple of less likely candidates all without effect.
Does anybody have any ideas??
Dave Collins
|
|
|
|
|
|
Which version of comctl32? Updating it (by installing latest IE) might fix it...
I remember such problems to. Either there was a flaky comctl32 version out, or it happens only in some "strange" scenarios. Can you reproduce the problem in a simple dialog based application with only the list box on it?
Flirt harder, I'm a Coder
mlog || Agile Programming | doxygen
|
|
|
|
|
How do you find a programs Process ID?
|
|
|
|
|
How about GetCurrentProcessId() ?
"The pointy end goes in the other man." - Antonio Banderas (Zorro, 1998)
|
|
|
|
|
That depends on the kind of data you already have.
Is it the current process? Or do you have the name of the executable? Or a window handle?
Jens
|
|
|
|
|
Yeah the name is armyops.exe
|
|
|
|
|
|
If you have the name of the process, and that process is not you, you must either search for a window you know that process created, and get the process ID from that, or, if you only have the name of the process, you need to use the PSAPI/ToolHelper API to enumerate all running processes, look at each one's name, check if it matched, and if so, grab it's process ID.
See here
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/perfmon/base/about_psapi.asp
Bare in mind PSAPI only works with NT/2k/XP so if you want a cross platform soulition, use ToolTip - see the file Tlhelp32.h in the platform SDK for a statring point- but you want something like this which terminates a process given a name
<br />
BOOL CTestEnvKillerApp::InitInstance()<br />
{<br />
<br />
OSVERSIONINFO osvi;<br />
memset(&osvi, NULL, sizeof(OSVERSIONINFO));<br />
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);<br />
GetVersionEx(&osvi);<br />
<br />
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{<br />
HMODULE hLib = LoadLibrary( _T("psapi.dll") );<br />
if (NULL == hLib)<br />
{<br />
AfxMessageBox(_T("Could not load PSAPI.DLL.\nPlease check it's in your path"), MB_OK | MB_ICONEXCLAMATION);<br />
return FALSE;<br />
}<br />
lpfnEnumProcesses pFnEnumProc = (lpfnEnumProcesses)GetProcAddress( hLib, "EnumProcesses" );<br />
lpfnGetModuleBaseName pFnGetModBaseName = (lpfnGetModuleBaseName)GetProcAddress( hLib, "GetModuleBaseNameA" );<br />
lpfnEnumProcessModules pFnEnumProcMod = (lpfnEnumProcessModules)GetProcAddress( hLib, "EnumProcessModules" );<br />
<br />
if ( (NULL == pFnEnumProc) || (NULL == pFnGetModBaseName) || (NULL == pFnEnumProcMod) )<br />
{<br />
AfxMessageBox(_T("Could not find procedure in PSAPI.DLL"), MB_OK | MB_ICONEXCLAMATION);<br />
FreeLibrary(hLib);<br />
return FALSE;<br />
}<br />
<br />
DWORD dwNeeded = 0;<br />
DWORD dwProcessIDs[1024];<br />
memset(dwProcessIDs, NULL, sizeof(DWORD)*1024);<br />
<br />
if ( pFnEnumProc(dwProcessIDs, 1024, &dwNeeded) )<br />
{<br />
char szProcessName[MAX_PATH];<br />
<br />
short sNumProcs = (short)( dwNeeded/sizeof(DWORD) );<br />
for (short s = 0; s < sNumProcs; s++)<br />
{<br />
memset(szProcessName, NULL, sizeof(char)*MAX_PATH);<br />
<br />
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE,<br />
FALSE, dwProcessIDs[s] );<br />
if (hProcess) <br />
{ <br />
HMODULE hMod = NULL;<br />
dwNeeded = 0;<br />
<br />
if ( pFnEnumProcMod( hProcess, &hMod, sizeof(hMod), &dwNeeded) ) <br />
{<br />
if (!pFnGetModBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName) ) )<br />
{<br />
CloseHandle(hProcess);<br />
continue;<br />
}<br />
<br />
if ( ItsOurProcess() )<br />
{<br />
TerminateProcess(hProcess, 0);<br />
}<br />
}<br />
<br />
CloseHandle(hProcess);<br />
}<br />
}<br />
}<br />
<br />
FreeLibrary(hLib);<br />
}<br />
else if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{<br />
HMODULE hLib = LoadLibrary( _T("kernel32.dll") );<br />
if (NULL == hLib)<br />
{<br />
AfxMessageBox(_T("Could not load kernel32.DLL.\nPlease check it's in your path"), MB_OK | MB_ICONEXCLAMATION);<br />
return FALSE;<br />
}<br />
<br />
lpfnProcess32First pFnProc32First = (lpfnProcess32First)GetProcAddress( hLib, "Process32First" );<br />
lpfnProcess32Next pFnProc32Next = (lpfnProcess32Next)GetProcAddress( hLib, "Process32Next" );<br />
lpfnTH32Snap pFnTH32Snap = (lpfnTH32Snap)GetProcAddress( hLib, "CreateToolhelp32Snapshot" );<br />
<br />
if ( (NULL == pFnProc32First) || (NULL == pFnProc32Next) || (NULL == pFnTH32Snap) )<br />
{<br />
AfxMessageBox(_T("Could not find procedure in Kernel32.DLL"), MB_OK | MB_ICONEXCLAMATION);<br />
FreeLibrary(hLib);<br />
return FALSE;<br />
}<br />
<br />
PROCESSENTRY32 pe;<br />
memset(&pe, NULL, sizeof(PROCESSENTRY32));<br />
<br />
HANDLE hSnapshot = pFnTH32Snap(TH32CS_SNAPPROCESS, 0);<br />
<br />
if (!hSnapshot)<br />
{<br />
AfxMessageBox(_T("Could not retrieve process snapshot"), MB_OK | MB_ICONEXCLAMATION);<br />
}<br />
<br />
pe.dwSize = sizeof(PROCESSENTRY32);<br />
<br />
if ( pFnProc32First(hSnapshot, &pe) )<br />
{<br />
MODULEENTRY32 me32 = {0}; <br />
BOOL bGotModule = FALSE; <br />
do<br />
{<br />
if ( GetProcessModule(pe.th32ProcessID, pe.th32ModuleID, &me32, sizeof(MODULEENTRY32), hLib) )<br />
{<br />
char szProcessName[MAX_PATH];<br />
memset(szProcessName, NULL, sizeof(char)*MAX_PATH);<br />
<br />
char drive[8];<br />
char dir[MAX_PATH]; <br />
char ext[8];<br />
_splitpath(me32.szExePath, drive, dir, szProcessName, ext);<br />
strcat(szProcessName, ext);<br />
<br />
if ( ItsOurProcess())<br />
{<br />
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE,<br />
FALSE, pe.th32ProcessID);<br />
if (hProcess)<br />
{<br />
<br />
TerminateProcess(hProcess, 0);<br />
<br />
CloseHandle(hProcess);<br />
}<br />
}<br />
}<br />
}<br />
while(pFnProc32Next(hSnapshot, &pe));<br />
}<br />
<br />
CloseHandle(hSnapshot);<br />
<br />
FreeLibrary(hLib);<br />
}<br />
else<br />
{<br />
AfxMessageBox(_T("Operating system does not support this application"), MB_OK | MB_ICONEXCLAMATION);<br />
}<br />
return FALSE;<br />
}
FYI ToolHelp works on both sets of platform so you could just use that
|
|
|
|
|
Hi!
I'm searching for code or just the name of the windows api function that can turn _only_ the screen (not the whole computer) into standby mode, in other words, turn it off, until the mouse gets moved or a key gets pressed.
I found out that there's a (user configurable) display idle timer, however, I haven't found a way to manipulate this timer programmatically.
There are actually quite a lot of functions in the windows api related to power managment, but seemingly not one to turn only the screen off...
Maybe someone can help me,
Martin Leonhartsberger
mleonhartsberger@a1.net
|
|
|
|
|
Create a power scheme where USER_POWER_POLICY.VideoTimeoutAc is set to 1 (second). Save the policy by calling WritePwrScheme() . Then call SetActivePwrScheme() to set the current power scheme to the one that you just created. This is just a high-level overview, but hopefully you get the gist enough to fill in the blanks.
"The pointy end goes in the other man." - Antonio Banderas (Zorro, 1998)
|
|
|
|
|
Yeah thanks I successfully used your description to send my screen into darkness after one second.
But (there's always one ) theres the problem of waking up again. If I don't move the mouse around continously the screen blankens immediately again (no surprise, timer is still set to 1 second).
So I thought, well, why don't wait the second until standby mode kicks in, and then write the old timer back? I use Sleep() for this, but the problem is, after Sleep() returns, the system thinks that it should awaken itself again and the screen turns on.
So, I need a way to wait this second and write the old scheme back WITHOUT letting the system think it should wakeup.
|
|
|
|
|
You might need to use GetLastInputInfo() to know when the mouse/keyboard was last used.
"The pointy end goes in the other man." - Antonio Banderas (Zorro, 1998)
|
|
|
|
|
I'd like to introduce into my app a control like Dundas Chart (it's so pretty..., but so expensive too..., no cracks wanted and no burning either) but I don't want to use Microsoft's Chart Control...
OH !!, I'm a MFC programmer.
Please, if you know about a class like Dundas Chart make me know it...
Thankx !!
|
|
|
|
|
|
If a computer is suspended/hibernating, does that affect then length of time a process will sleep for?
If a process is told to Sleep () for 1 hour and after half an hour the computer is put into hibernate for 2 hours, when it starts back up again and Windows resumes, does the process still have half an hour to Sleep (), or is its Sleep () time up (having effectively slept for 2 1/2 hours already)?
|
|
|
|
|
i don't know for your effective question, but don't use sleep() function for so long waits...
i uses active waits, and so need full CPU time.
TOXCCT >>> GEII power
|
|
|
|
|
Yeah, it's not good - I got a program dropped on my desk and while I'm fixing it by re-writing it, I still have to try and make the old version work
|
|
|
|
|